C言語関係掲示板

過去ログ

No.1. 文字列の比較


 はじめまして、寺内と申します。最近VisualC++6.0を購入したばかりのC言語初心者です。
ところで、以下のようなコードで「クイズ」をするプログラムを作ろうとしたのですが、うまくいきません。
「catの意味は何ですか?」と画面に表示され、「ねこ」と入力すると「正解です」、「ねこ」以外の入力だと「不正解です」、と出力されるようにしたかったのですが、「ねこ」を1回入力しただけでは反応がなく、2回目も「ねこ」と入力しても、「不正解です」が返ってきます。どこがどうまずいのかも分からない状態なので、なにかヒントのようなものをいただきたくカキコしました。よろしくお願いいたします。
m(--)m

#include<stdio.h>
char str1[] = "cat" ;

void main()
{
printf("%sの意味は何ですか?\n",str1);
char str2[] = "ねこ";
char str3[] = " ";
scanf("%s\n",str3);
if (str3 == str2)
printf("正解です\n");
else
printf("不正解です\n");

return;
}


はじめまして、ともじと申します。ソース拝見しました。

> 「ねこ」を1回入力しただけでは反応がなく、
> char str3[] = " ";
> scanf("%s\n",str3);

まず、str3の配列の宣言が小さすぎます。これでは、スペース1バイト+'\0'で2バイトのエリア
しか取られていません。scanf()で "ねこ" と入力した時点で別のエリアを壊してしまいます。
"ねこ" は '\0'を含んで5バイトありますが(漢字は1文字2バイト)、scanf()で文字列を
入力する場合には、最低画面1行分(80バイト)の大きさを宣言しておいた方がいいでしょう。
次に、scanf()での書式指定に'\n'は含まない方がいいでしょう。

> 2回目も「ねこ」と入力しても、「不正解です」が返ってきます。
> if (str3 == str2)

文字列が等しいかどうかを比べるときには、strcmp()関数を使います。
C言語では単に "==" で、文字列の比較は出来ないんですよ。

それから、C++ではいいのですが、C言語の場合は変数や配列の宣言はプログラムの先頭、
実行文が始まる前で行わなければなりませんので、注意してください。

以下、修正済みソースです

#include<stdio.h>
#include<string.h> /* strcmp()を使用するために必要 */
char str1[] = "cat" ;

void main()
{
char str2[] = "ねこ"; /* 変数、配列の宣言は最初がいいでしょう */
/* char str3[] = " "; */
char str3[80]; /* 文字列エリアは十分大きく */

printf("%sの意味は何ですか?\n",str1);

/* scanf("%s\n",str3); \nがあると、動作がおかしくなる場合があります */
scanf("%s",str3);

/* if (str3 == str2) */
if (strcmp(str3,str2)==0) /* 文字列が等しいかどうかはstrcmp()で比べます*/
printf("正解です\n");
else
printf("不正解です\n");

return;
}


さっそくのお返事ありがとうございました。
中身の分からない文字列エリアは十分大きくとること、
scanf(%s,str3)で、\nがあると動作がおかしくなること、
文字列が等しいかどうかを比べるstrcmp()という関数があることなど
自分の知らないことばかりでした。私はVBを少しかじったことがあるのですが、VBでは文字列の比較は If Text1.Text=Text2.Text で済んだので、もっとCのやり方に慣れていかなければ、と思いました。
 また質問があったらカキコします。今度はもっとレベルの高い質問をもってこれるよう頑張ります。 (^^)

戻る


「初心者のためのポイント学習C言語」 Last modified:2001.7.25
Copyright(c) 2000-2002 TOMOJI All Rights Reserved