第7章の1 文字列操作関数

1. 標準ライブラリ関数とは

コンパイラメーカがよく使う機能をオブジェクトライブラリとして提供してくれるものを「標準ライブラリ関数」と言います。 入出力、文字列操作、文字操作、数学処理など機能別に多くのライブラリ関数が存在します。

以下にごく基本的でよく使われるライブラリ関数についてまとめます。尚、入出力関数については、第5章と第8章をご参照下さい。

2. 代表的な文字列操作関数

文字列を処理するための関数です。
文字列のコピー、連結、比較、長さの取得などを行います。
#include <string.h> が必要です。「#include」については「18-2」 を参照してください。

【文字列操作関数】
関数 説明 使用例
strcpy

文字列a に文字列b をコピーする。

strcpy(a, b);

char a[10], b[10];

strcpy(a, "some");
strcpy(b, "day");
strcpy(a, b);

‘\0’ もコピーするので文字列aは
その分も考えて大きさを宣言しておくこと。

strcat

文字列a のうしろに文字列b を連結する。

strcat(a, b);

char a[10] = "some";
char b[10] = "day";

strcat(a, b);
strlen

文字列a の長さを取得。’\0’は長さに含めない。

strlen(a);

size_t len;
char a[] = "today";

len = strlen(a);
printf("長さ = %zu\n", len);

strlenの返却値型はsize_t型
size_t型のprintfの変換指定は%zu

strcmp

文字列a と文字列b を比較する。

strcmp(a, b);

a > b で正、a < b で負、a = bで 0 を返す。

大小関係は一般に文字コード順による。

char a[128], b[128];

scanf("%s", a);
scanf("%s", b);

if (strcmp(a, b) == 0) {
	printf("等しい文字列\n");
} else {
	printf("異なる文字列\n");
}
strncpy strncpy(a, b, n);
文字列a に文字列b の先頭 n文字をコピーする。
strncat strncat(a, b, n);
文字列a のうしろに文字列b の先頭 n文字を連結する。
strncmp strncmp(a, b, n);
先頭 n文字だけ文字列a と文字列b を比較する。

〇 演習問題

問1

次のフローチャートに基づいてプログラムを作成しなさい。

【実行結果例】
文字列 a = abcde
文字列 b = vwxyz
文字 a は b より小
文字列 a = abcdevwxyz
文字列 a の長さ = 10

問2

文字列 A に入力された文字列を、100文字丁度になるまで、文字列 B に連結しなさい。

【実行結果例】
文字列を入力してください > ABCDEFGHI
str = ABCDEFGHI
文字列を入力してください > abcdefghi
str = ABCDEFGHIabcdefghi
文字列を入力してください > 12345
str = ABCDEFGHIabcdefghi12
文字列の長さ = 20

水色文字はキーボードからの入力

解答例

// 問1
#include <stdio.h>
#include <string.h>

int main(void)
{
    char a[20], b[20];

    strcpy(a, "abcde");
    strcpy(b, "vwxyz");
    printf("文字列a = %s\n文字列b = %s\n", a, b);

    if (strcmp(a, b) == 0 ) {
        printf("文字a,bは等しい\n");
    }
    else if (strcmp( a, b ) > 0) {
        printf("文字aはbより大\n");
    }
    else {
        printf("文字aはbより小\n");
    }

    strcat(a, b);
    size_t len = strlen(a);
    printf("文字列a = %s\n", a);
    printf("文字列aの長さ = %zu\n", len);

    return 0;
}
// 問2
#include <stdio.h>
#include <string.h>

#define LEN 20  //(注)#defineについては第18章を参照してください

int main(void)
{
    char str_a[LEN + 1] = ""; // 配列を'\0'で埋める
    char str_b[LEN + 1] = "";

    while(strlen(str_b) < LEN) {
        printf( "文字列を入力してください > " );
        scanf("%20s", str_a);
        strncat(str_b, str_a, LEN - strlen(str_b));
        printf("str = %s\n", str_b);
    }
    printf("文字列の長さ = %zu\n", strlen(str_b));
        
    return 0;
}

コメント