· 2分で読了
C言語における文字列処理
# 開発ノート この記事は中国語から自動翻訳されたものです。翻訳によりニュアンスが失われている場合があります。
C言語では、strlenを使用して文字列の長さを取得できます。しかし、strlenを呼び出すたびにの時間がかかるため、文字列操作が頻繁に行われるアプリケーションでは、文字列の長さが大きいとパフォーマンスのボトルネックになる可能性があります。特に大規模なトラフィックがあるアプリケーションでは、この問題が顕著です。解決策の一つは、別の変数に文字列の長さを保存し、文字列に対する操作があるたびにその変数を変更することです。これにより、文字列の長さを取得する際はこの変数を参照するだけで済み、時間計算量はになります。
もう一つ注意が必要なのは、C言語はバッファの長さに対して何のデフォルト設定も行わないため、concatなどの操作を行う際には非常に注意が必要です。例えば、strcatを使用して以下のように記述すると:
#include <stdio.h>
#include <string.h>
int main(void) {
char buf1[20] = "abc";
char buf2[] = "def";
strcat(buf1, buf2);
printf("%s\n", buf1);
return 0;
}
このコードは、buf2の内容をbuf1に結合し、buf1の後に追加します。しかし、buf1のサイズを5に減らすと:
#include <stdio.h>
#include <string.h>
int main(void) {
+ char buf1[4] = "abc";
char buf2[] = "def";
strcat(buf1, buf2);
printf("%s\n", buf1);
return 0;
}
実行すると、エラーが発生します。これは、buf1とbuf2を結合した後のサイズが4を超えてしまい、バッファオーバーフローが発生したためです。解決策としては、concat操作を実行する前に、結合後の文字列の長さがオーバーフローを引き起こさないかを事前に確認する必要があります。もしオーバーフローが起こる場合は、メモリサイズを再割り当てする必要があります。
関連記事
- Access Keyはもう使うなAccess KeyはAWSで見落とされがちなセキュリティリスクだ。OIDCとIAM Roleを組み合わせれば、GitHub Actionsはsecretなしで安全にAWSリソースを操作できる
- データベースの主キー: AUTO_INCREMENT、UUID、UUIDv7バックエンド開発では主キーをどうするかをよく決める必要がある。auto increment か UUID か、衝突はどうするか、UUIDv7 と created_at + index の性能差はどれくらいか。実際に 2000 万件のデータで検証し、設計判断までまとめる。
- Zeabur を使ってみた一般的な独立開発者がサービスをデプロイする際には、Vercelのようなプラットフォームを選択することが多いですが、データベース接続のようなより高度なニーズが必要になると、Vercelはあまり便利ではありません。また、一般的なクラウドサービスプロバイダーの価格は独立開発者にとって高額です。この記事では、Zeaburを使用した際の体験を共有し、皆さんにおすすめします!
- キーボードについて - ファームウェア編本篇為 IT 2023 鐵人賽文章:鍵盤入坑指南 - 韌體篇