strlen、strcpy、strcat
基本的な文字列関数です。
「strlen、strcpy、strcat」はCoddyKit上の無料C Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C Academyコースには全4レッスンが含まれています。
C言語の文字列
C言語では、文字列は特殊なnull終端文字である'\0'で終わるcharの配列にすぎません。
<string.h>の関数は、この終端文字を使って文字列の終わりを判断します。終端文字がないと、配列の末尾を越えて読み取ります。
#include <stdio.h>
int main(void) {
char name[] = "Alice";
printf("%s\n", name);
printf("Bytes used: %lu\n", sizeof(name));
return 0;
}string.hをインクルードする
文字列関数を使うには、次のヘッダーをインクルードする必要があります。
#include <string.h>
これにより、strlen、strcpy、strcat、strcmpなどを使えるようになります。
#include <stdio.h>
#include <string.h>
int main(void) {
char greeting[] = "Hello";
printf("Length is %lu\n", strlen(greeting));
return 0;
}strlen:文字数を数える
strlenは、null終端文字より前にある文字数を返します。'\0'自体は数えません。
そのため、配列が4バイトを保持していても、strlen("cat")の戻り値は3です。
#include <stdio.h>
#include <string.h>
int main(void) {
char word[] = "cat";
printf("strlen = %lu\n", strlen(word));
printf("sizeof = %lu\n", sizeof(word));
return 0;
}strlenはO(n)
C言語の文字列には長さが保存されていないため、strlenは'\0'を見つけるまで、すべての文字を順番に調べる必要があります。
そのため、計算量はO(n)です。大きな文字列に対して、ループ条件内で繰り返し呼び出すのは避けてください。
#include <stdio.h>
#include <string.h>
int main(void) {
char msg[] = "programming";
size_t len = strlen(msg);
for (size_t i = 0; i < len; i++) {
printf("%c", msg[i]);
}
printf("\n");
return 0;
}strcpy:文字列をコピーする
=では文字列をコピーできません。strcpy(dest, src)を使うと、null終端文字を含めてsrcをdestにコピーできます。
コピー先は、コピー元と終端文字を格納できる十分な大きさでなければなりません。
#include <stdio.h>
#include <string.h>
int main(void) {
char src[] = "Hello";
char dest[20];
strcpy(dest, src);
printf("%s\n", dest);
return 0;
}strcpyによるバッファオーバーフローの危険
destが小さすぎると、strcpyはバッファの範囲外に書き込み、メモリを破壊します。これは典型的なセキュリティバグです。
最大nバイトをコピーするstrncpy(dest, src, n)を優先してください。ただし、srcが長すぎる場合、strncpyはnull終端しないことがあります。
#include <stdio.h>
#include <string.h>
int main(void) {
char src[] = "LongString";
char dest[5];
strncpy(dest, src, 4);
dest[4] = '\0';
printf("%s\n", dest);
return 0;
}strcat:文字列の連結
strcat(dest, src)は、srcをdestの末尾に追加します。destのヌル終端文字の位置から書き込みを開始し、末尾に新しいヌル終端文字を追加します。
destは、十分な空き領域を持つ有効な文字列でなければなりません。
#include <stdio.h>
#include <string.h>
int main(void) {
char buffer[20] = "Hello, ";
strcat(buffer, "World");
printf("%s\n", buffer);
return 0;
}段階的な文字列の構築
strcpyとstrcatをつなげて呼び出すことで、文字列を少しずつ構築できます。
最初のstrcatが有効な終端文字を見つけられるように、必ず初期化済みのバッファーから始めてください。
#include <stdio.h>
#include <string.h>
int main(void) {
char full[50];
strcpy(full, "Mr. ");
strcat(full, "John ");
strcat(full, "Smith");
printf("%s\n", full);
return 0;
}strncatによるより安全な連結
strncat(dest, src, n)は、srcから最大n文字をdestに追加し、その後必ずヌル終端文字を追加します。
これにより、ソースの長さが不明な場合にバッファーオーバーフローを防ぎやすくなります。
#include <stdio.h>
#include <string.h>
int main(void) {
char dest[16] = "Data: ";
char src[] = "1234567890";
strncat(dest, src, 5);
printf("%s\n", dest);
return 0;
}戻り値
strcpyとstrcatは、どちらもdestへのポインターを返します。そのため呼び出しを入れ子にできますが、可読性が下がる場合があります。
strlenは符号なしのsize_tを返します。符号付き整数と比較するときは注意してください。
#include <stdio.h>
#include <string.h>
int main(void) {
char a[20] = "foo";
char b[] = "bar";
printf("%s\n", strcat(a, b));
return 0;
}よくあるメモリー確保の落とし穴
よくある間違いは、バッファーのサイズを決めるときにヌル終端文字用の+1を忘れることです。
長さがnの文字列には、n + 1バイトが必要です。2つの文字列を連結した場合の長さは、strlen(a) + strlen(b) + 1です。
#include <stdio.h>
#include <string.h>
int main(void) {
char a[] = "abc";
char b[] = "de";
size_t needed = strlen(a) + strlen(b) + 1;
printf("Need %lu bytes\n", needed);
return 0;
}クイックチェック
文字列の長さについての理解度を確認しましょう。
まとめ
主要なstring.h関数について学びました。
- strlenは
'\0'より前の文字数を数えます(O(n))。 - strcpyは文字列をコピーします。コピー先は十分な大きさでなければなりません。
- strcatは既存の文字列の末尾に追加します。
- ヌル終端文字用の領域を必ず確保し、安全性のために
strn*形式の関数を優先してください。
よくある質問
「strlen、strcpy、strcat」レッスンは無料ですか?
はい。「strlen、strcpy、strcat」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C Academyコースには全4レッスンが含まれています。
「strlen、strcpy、strcat」で何を学びますか?
基本的な文字列関数です。 ブラウザで直接実行するハンズオンコードでC Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「strlen、strcpy、strcat」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC Academyレッスンでコードを書いて実行できますか?
はい。すべてのC Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- strlen、strcpy、strcat
- strcmp と比較
- strtok とトークン化
- memcpy と memset