C言語-文字列処理
前へ 目次へ 次へ 

1.3 文字列処理関数 (3)

(関数strcpy, strcat)
入力した2つの文字列を1つに連結する。[pro1-9.c]

 入力文字列を配列buff1, buff2に格納し、配列buffに連結した結果を格納することにする。まず、配列buff1のデータを配列buffにコピーし、次に配列buff2のデータを配列buffに連結する。
 配列buff1のデータを配列buffに格納するのに、

buff = buff1;

とはできない。配列名のbuff1は先頭アドレス表す定数であり、上の式はそのアドレスをbuff(これも先頭アドレス表す定数)に格納することになる。(実際にはエラーである。配列名はアドレスを表す定数である。)

#include <string.h>
char *strcpy(char *str1, char *str2);

文字列str1に文字列str2をコピーする。(結果は、str1とstr2が同じ内容になる)

#include <string.h>
char *strcat(char *str1, char *str2);

文字列str1に文字列str2を連結する。(連結した結果は、str1に格納される)


 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
#include <stdio.h>
#include <string.h>

int main(void)
{
    char buff[256];    /* 連結文字列用 */
    char buff1[256];   /* 入力文字列用 */
    char buff2[256];   /* 入力文字列用 */

    printf("文字列1 : ");  /* プロンプト表示 */
    gets(buff1);          /* 文字列入力 */
    printf("文字列2 : ");  /* プロンプト表示 */
    gets(buff2);          /* 文字列入力 */

    strcpy(buff, buff1);  /* 文字列コピー(buff$ = buff1$) */
    strcat(buff, buff2);  /* 文字列連結(buff$ = buff$ + buff2$) */

    printf("文字列は%sです\n", buff);    /* 連結文字列表示 */
    return(0);
}
実行結果
文字列1 : abcd
文字列2 :
efgh
文字列はabcdefghです

 実行結果のように入力した場合、各配列は次のようになる。
strcat

 

【練習問題1-6】 endが入力されるまでの文字列を連結する。 [ren1-6.c]

 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
#include <stdio.h>
#include <string.h>

int main(void)
{
    char buff0[256];    /* 連結文字列用 */
    char buff[256];     /* 入力文字列用 */

    buff0[0] = @    ;    /* 初期化 */
    A        {
        printf("文字列 : ");    /* プロンプト表示 */
        gets(buff);             /* 文字列入力 */

        if(B                )
            break;
        else
           C                          ;
    }
    printf("文字列はD    です\n", buff0);
    return(0);
}

 文字列入力用と連結用の配列を用意する。連結用は、先頭アドレス(配列の先頭)にヌル文字を格納して初期化しておく。

実行結果
文字列 : abcd
文字列 :
efghijk
文字列 :
end
文字列はabcdefghijkです


[解答欄] (すべて半角文字で、空白文字もチェックされます。)
@   A   B   C   D
     

 

(関数strstr)
文字列を検索する。[pro1-10.c]

 文字列の中に指定した文字列(検索文字列)が含まれるかどうかを判定する標準ライブラリの関数strstrを使用する。

#include <string.h>
char *strstr(char *str1, char *str2);

文字列str1に文字列str2が含まれていれば、その先頭アドレスを返す。含まれていないときはNULLを返す。

 下図の場合、strstr(buff, srch);は、アドレスbuff + 2を返す。

strstr


 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
#include <stdio.h>
#include <string.h>

#define STR_MAX 256

int main(void)
{
    char *ans;        /* ポインタ変数(「1.4 ポインタ」で説明) */
    char buff1[STR_MAX], buff2[STR_MAX];
    int x;

    printf("関数strstr()のテスト\n");
    printf("検索対象文字列 : ");
    gets(buff1);
    printf("検索文字列 : ");
    gets(buff2);

    ans = strstr(buff1, buff2);
    if(ans != NULL){
        x = (int)(ans - buff1) + 1;
        printf("検索対象文字列の%dけた目に検索文字列が含まれています\n", x);
    }else
        printf("検索対象文字列の中に検索文字列が含まれていません\n");
    return(0);
}
実行結果
関数strstr()のテスト
検索対象文字列 :
abcdefghicdefgh
検索文字列 :
cde
検索対象文字列の3けた目に検索文字列が含まれています

 4行目の#define STR_MAX 256は、データにわかりやすい(覚えやすい)別の名前を付けるのに使用する。この文以降、プログラム中にSTR_MAXが現れると256に置き換えられる。(プリプロセッサ命令)
20行目で何けた目に発見されたか計算している。変数ans, buff1はともにアドレスであるから、キャスト演算子(int)でint型に変換している。


前へ 目次へ 次へ 
Copyright © 2001 Hiroshi Masuda 

 

 

inserted by FC2 system