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です |
【練習問題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です |
(関数strstr)
文字列を検索する。[pro1-10.c]
文字列の中に指定した文字列(検索文字列)が含まれるかどうかを判定する標準ライブラリの関数strstrを使用する。
#include <string.h> char *strstr(char *str1, char *str2); 文字列str1に文字列str2が含まれていれば、その先頭アドレスを返す。含まれていないときはNULLを返す。 |
下図の場合、strstr(buff, srch);は、アドレスbuff + 2を返す。
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 |