· 2分で読了

C言語における文字列処理

# 開発ノート
この記事は中国語から自動翻訳されたものです。翻訳によりニュアンスが失われている場合があります。

C言語では、strlenを使用して文字列の長さを取得できます。しかし、strlenを呼び出すたびにO(n)O(n)の時間がかかるため、文字列操作が頻繁に行われるアプリケーションでは、文字列の長さが大きいとパフォーマンスのボトルネックになる可能性があります。特に大規模なトラフィックがあるアプリケーションでは、この問題が顕著です。解決策の一つは、別の変数に文字列の長さを保存し、文字列に対する操作があるたびにその変数を変更することです。これにより、文字列の長さを取得する際はこの変数を参照するだけで済み、時間計算量はO(1)O(1)になります。

もう一つ注意が必要なのは、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操作を実行する前に、結合後の文字列の長さがオーバーフローを引き起こさないかを事前に確認する必要があります。もしオーバーフローが起こる場合は、メモリサイズを再割り当てする必要があります。