第 11 回 - 文字列操作(2)

[6/3, 2006 H.Aman]
67x27(1669bytes)   67x27(1669bytes) 【課題 1】

例題 1

2 つの文字列(それぞれ改行を含めて 64 文字未満)を読み込み, それらを 1 行に連結した文字列を作りなさい.
ただし,連結の結果に改行文字は含めないものとする.

コーディング例

     1	/*
     2	 * プログラミング演習 第 11 回
     3	 * [例題 1]
     4	 * (C) 2006 Hirohisa AMAN <aman@cs.ehime-u.ac.jp, aman@computer.org>
     5	 */
     6	#include <stdio.h>
     7	#include <string.h>
     8
     9	int main(void){
    10	  char str[64];
    11	  char text[128];
    12	  int i;
    13	
    14	  /* 1 つ目の文字列を読み込む */
    15	  printf(" 1 > ");
    16	  fgets(str, 64, stdin);
    17	
    18	  /* 後ろから 2 文字目に改行文字があるので '\0' で上書き */
    19	  i = strlen(str);
    20	  str[i-1] = '\0';
    21	
    22	  /* そのまま text へコピーする */
    23	  strcpy(text, str);
    24	
    25	  /* 2 つ目の文字列を読み込み,1 つ目と同様に改行文字を消す */
    26	  printf(" 2 > ");
    27	  fgets(str, 64, stdin);
    28	  i = strlen(str);
    29	  str[i-1] = '\0';
    30	  
    31	  /* text の後ろに str を追加する */
    32	  strcat(text, str);
    33	
    34	  printf("連結文字列: %s\n", text);
    35	
    36	  return 0;
    37	}
     
※左端の数字は行番号であり,ソースコードには含まれない点に注意!

コンパイル & 実行例

     $ gcc example11_1.c [Enter]
     $ ./a.out [Enter]
      1 > aman@computer [Enter]
      2 > .org [Enter]
     連結文字列: aman@computer.org
     

解説

2 つの 文字列を連結 するには strcat という関数を利用するとよい.

基本的な使い方は
 strcat(str1, str2); 
であり,文字列 str1 の後ろにもう 1 つの文字列 str2 が追加される.
例えば,

329x105(13979bytes)
という状態にあったとして, strcat(str1, str2);  を実行すると
329x105(15171bytes)
という状態になる. つまり,コピー元の str2 に変化は無く, str1 の後ろに str2 の内容が追加され,1 つのより長い文字列となる.
もちろん,str1 には追加分を格納できるだけの空き領域が必要である.

ここではまず,23 行目

     23	  strcpy(text, str);
で str 内の文字列を text へコピーし,32 行目
     32	  strcat(text, str);
でその後ろに文字列の追加(連結)を行っている.

その他に注意しておく点として 改行文字を消す という作業がある.
(前回の演習で学んだ)関数 fgets は, 文字列を 1 行まとめて読み込むのに便利であるが, 入力の際に最後に打ち込んだ改行文字('\n') (※Enter キーによるもの) までも文字列の一部として扱われる.
例えば,キーボードから

     aman@computer[Enter]
と打ち込むと, 文字列としては次のように解釈される:
531x47(14346bytes)
ちょうど後ろから 2 番目に改行文字('\n')が入ることになるので, ここに終端文字('\0')を上書きしてやればよい.
まず,この文字列の長さを調べると 14 ということになる (strlen 関数を使用). そして,その 1 つだけ前の文字(13 番目)に '\n' が入っているので, これを '\0' で上書きする. この操作が 19 〜 20 行目と 28 〜 29 行目で行われている:
     19	  i = strlen(str);
     20	  str[i-1] = '\0';

     28	  i = strlen(str);
     29	  str[i-1] = '\0';