カランのブログ

ソフトウェアエンジニア / 台湾人 / 福岡生活

今のモード ライト

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操作を実行する前に結合後の文字列の長さがオーバーフローを引き起こすかどうかを事前にチェックし、必要に応じてメモリサイズを再割り当てすることです。

作者

Kalan 頭像照片,在淡水拍攝,淺藍背景

愷開 | Kalan

Kalan です。台湾出身で、2019年に日本へ転職し、福岡に住んでいます。フロントエンド開発に精通しているだけでなく、IoT、アプリ開発、バックエンド、電子工作などの分野にも挑戦しています。 最近、エレキギターを始めました。ブログを通じて、より多くの人と交流できればと思っています。気軽に絡んでください