0Pricing
C Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. strlen、strcpy、strcat
  2. strcmp と比較
  3. strtok とトークン化
  4. memcpy と memset
← C Academyに戻る