C言語

【C言語】第3章第5回:文字列操作関数:strcpy, strcat, strlenなど

C言語の文字列操作には、strcpystrcatstrlenなど、標準ライブラリ関数が便利です。この章では、それらの関数の使い方を詳しく解説します。

1. strcpy関数:文字列のコピー

strcpyは、ある文字列を別の文字列にコピーするために使用します。

基本構文:

char *strcpy(char *destination, const char *source);

例:文字列をコピーするプログラム

#include <stdio.h>
#include <string.h>

int main() {
    char source[] = "Hello, World!";
    char destination[50];

    strcpy(destination, source);

    printf("Source: %s\n", source);
    printf("Destination: %s\n", destination);

    return 0;
}

解説:

  • strcpysourceの内容をdestinationにコピーします。
  • destinationのサイズがsourceより小さい場合、バッファオーバーフローのリスクがあります。

2. strcat関数:文字列の連結

strcatは、1つの文字列の末尾に別の文字列を連結します。

基本構文:

char *strcat(char *destination, const char *source);

例:文字列を連結するプログラム

#include <stdio.h>
#include <string.h>

int main() {
    char greeting[50] = "Hello, ";
    char name[] = "Alice";

    strcat(greeting, name);

    printf("%s\n", greeting);

    return 0;
}

解説:

  • strcatgreetingの末尾にnameを追加します。
  • 連結先の配列サイズが十分であることを確認する必要があります。

3. strlen関数:文字列の長さを測定

strlenは、文字列の長さ(ヌル文字'\\0'を除く)を返します。

基本構文:

size_t strlen(const char *str);

例:文字列の長さを測定するプログラム

#include <stdio.h>
#include <string.h>

int main() {
    char word[] = "C programming";

    printf("Length of '%s': %lu\n", word, strlen(word));

    return 0;
}

解説:

  • strlenはヌル文字を含めずに文字列の長さを返します。
  • 配列全体のサイズを取得したい場合はsizeofを使用します。

4. 他の便利な文字列操作関数

4.1 strcmp関数:文字列の比較

strcmpは2つの文字列を辞書順で比較します。

int strcmp(const char *str1, const char *str2);

例:文字列を比較するプログラム

#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "Apple";
    char str2[] = "Banana";

    int result = strcmp(str1, str2);

    if (result < 0) {
        printf("%s is less than %s\n", str1, str2);
    } else if (result > 0) {
        printf("%s is greater than %s\n", str1, str2);
    } else {
        printf("%s is equal to %s\n", str1, str2);
    }

    return 0;
}

解説:

  • strcmpは文字列を比較し、str1str2より小さい場合は負の値、大きい場合は正の値、等しい場合は0を返します。

4.2 strncpy関数:安全な文字列コピー

strncpyは、指定した長さだけ文字列をコピーします。

#include <stdio.h>
#include <string.h>

int main() {
    char source[] = "Hello, World!";
    char destination[8];

    strncpy(destination, source, 7); // 最初の7文字をコピー
    destination[7] = '\\0'; // ヌル文字を追加

    printf("Partial copy: %s\n", destination);

    return 0;
}

解説:

  • strncpyはコピーする文字数を指定できるため、安全性が高まります。
  • 手動でヌル文字を追加する必要がある場合があります。

5. 練習問題

以下の課題に挑戦して、文字列操作関数の使い方を練習しましょう。

  1. ユーザーから入力された2つの文字列を連結して出力するプログラムを作成してください。
  2. 文字列をコピーする際に、strncpyを使用して安全にコピーするプログラムを作成してください。
  3. 文字列を辞書順で比較して、結果を出力するプログラムを作成してください。

6. 練習問題の解答と解説

問1の解答

#include <stdio.h>
#include <string.h>

int main() {
    char str1[50], str2[50];

    printf("Enter first string: ");
    scanf("%s", str1);

    printf("Enter second string: ");
    scanf("%s", str2);

    strcat(str1, str2);
    printf("Concatenated string: %s\n", str1);

    return 0;
}

問2の解答

#include <stdio.h>
#include <string.h>

int main() {
    char source[] = "Hello, World!";
    char destination[8];

    strncpy(destination, source, 7);
    destination[7] = '\\0';

    printf("Copied string: %s\n", destination);

    return 0;
}

問3の解答

#include <stdio.h>
#include <string.h>

int main() {
    char str1[50], str2[50];

    printf("Enter first string: ");
    scanf("%s", str1);

    printf("Enter second string: ");
    scanf("%s", str2);

    int result = strcmp(str1, str2);

    if (result < 0) {
        printf("%s is less than %s\n", str1, str2);
    } else if (result > 0) {
        printf("%s is greater than %s\n", str1, str2);
    } else {
        printf("%s is equal to %s\n", str1, str2);
    }

    return 0;
}

7. まとめ

文字列操作関数を活用することで、効率的に文字列を操作できます。strcpystrcatstrlenなどを安全に使用するために、適切なサイズ管理を行いましょう。