連載
» 2019年02月22日 10時00分 公開

バグ検出ドリル(15)なぜ「山田三郎」が「まだまだ天田三郎」に化けるのか山浦恒央の“くみこみ”な話(115)(2/3 ページ)

[山浦恒央 東海大学 大学院 組込み技術研究科 非常勤講師(工学博士),MONOist]

3.今回の問題

 A君は、学校の宿題で2つの文字列を連結するstrcatの宿題に取り組んでいる。宿題は、名前を表す変数(name1、name2、name3)のそれぞれの文字列に、名字(familyname)の文字列を連結して表示するもので、A君は「リスト1」のプログラムを作った。A君は、おのおのの名前に名字を連結したつもりなので、「リスト2」の実行結果を期待したが、実際には、「リスト3」となった。なぜ、意図した通りに動作しなかったか、原因を推察せよ。なお、デバッグは、机上で考察すること。

/*
	StrcatPractice.c
	名前連結プログラム
	仕様: 名前を表すname1〜3のそれぞれに、名字を表すfamilynameを連結する
*/
#include <stdio.h>
#include <string.h>
int main(void)
{
	// 名字
	char familyname[] = "Yamada";
	
	// 名前
	char name1[] = "Ichiro";
	char name2[] = "Ziro";
	char name3[] = "Saburo";
	// 連結
	strcat(name1, familyname);
	strcat(name2, familyname);
	strcat(name3, familyname);
	printf("name1 = %s\n",name1);
	printf("name2 = %s\n",name2);
	printf("name3 = %s\n",name3);
	return 0;
}
リスト1 名前連結プログラム
name1 = IchiroYamada
name2 = ZiroYamada
name3 = SaburoYamada
リスト2 期待した実行結果
name1 = mada
name2 = mada
name3 = Saburoamada
リスト3 実際の実行結果

Copyright © ITmedia, Inc. All Rights Reserved.