みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

プログラミング ポインタを使った文字列比較

プログラミング ポインタを使った文字列比較

2つの文字列str1, str2を入力し,それらが等しければ0,等しくなければ1を返す関数str_compareを作り、返り値によって以下のように表示するプログラムを作れ。ただし,関数strcmpを使ってはならない。
文字列の入出力はmain関数で行い,関数str_compareの仮引数にはポインタ変数を宣言し,ポインタと間接演算子*を用いた処理を行うこと。

% ./a.out
input str1 = Worldcup
input str2 = Worldcup
same strings

% ./a.out
input str1 = World
input str2 = cup
different strings


この問題に私は次のようにプログラミングしました。

#include <stdio.h>

#define MAX 100

int str_compare(char *, char *);

main()
{
char str1[MAX], str2[MAX];

printf("input str1 = %s", str1);
scanf("%s", str1);
printf("input str2 = %s", str2);
scanf("%s", str2);

str_compare(str1, str2);

if (str_compare(str1, str2) == 0)
printf("same strings\n");
else if (str_compare(str1, str2) == 1)
printf("different strings\n");
}


int str_compare(char *s1, char *s2)
{
int i;

for (i = 0; s1[i] != '\0'; i++) {
if (s1[i] != s2[i]) {
break;
}
}
if (s1[i] == s2[i]) {
return 0;
} else {
return 1;
}
}


これで実行したところ、「input str1 =」の右のスペースが文字化け?してしまいます。(半角カタカナや記号が出る)ただ、その後に文字列を入力すると、正しく機能します。
これは何が悪いなのでしょうか、どなたか教えてください。

投稿日時 - 2010-06-15 23:27:45

QNo.5971543

すぐに回答ほしいです

質問者が選んだベストアンサー

>printf("input str1 = %s", str1);

str1を出力することは不要です。"input str1 = " だけでじゅうぶん。

>printf("input str2 = %s", str2);

上に同じ。

>str_compare(str1, str2);

この行は不要です。

>ポインタと間接演算子*を用いた処理を行うこと。

この条件を満たしていないのでは?

投稿日時 - 2010-06-15 23:45:11

お礼

ご回答ありがとうございます。
>>>ポインタと間接演算子*を用いた処理を行うこと。
>>この条件を満たしていないのでは?
確かに、添え字を使って誤魔化していますね…
以下のように、str_compare関数の中身だけ変更しました。これでOKですか?

int str_compare(char *s1, char *s2)
{
while (*s1 == *s2){
if (*s1 == '\0')
return 0;
s1++;
s2++;
}
return 1;
}

投稿日時 - 2010-06-16 00:20:57

このQ&Aは役に立ちましたか?

8人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

「ポインタと間接演算子*を用いた処理を行うこと」という条件だけなら, s1[i] とか s2[i] とかを *(s1+i) とか *(s2+i) とかに直せば OKですね>#2.
あるいは「s1[i] というのは規格上 *(s1+i) と等価であり, 明示的にではないが間接演算子をつかっている」と言い張ってみるのもいいかもしれません.

投稿日時 - 2010-06-16 11:25:57

お礼

ご回答ありがとうございます。勉強になりました。

投稿日時 - 2010-06-16 19:40:06

ANo.3

> printf("input str1 = %s", str1);
> scanf("%s", str1);
> printf("input str2 = %s", str2);
> scanf("%s", str2);
と、scanfで値を入力する前にprintfで表示させているからですよ。
そもそも、scanfで取得しようとしているstr1やstr2を取得する前に
表示させる必要はないので、プログラムはこんなふうに書けばよいでしょう。

printf("input str1 = ");
scanf("%s", str1);
printf("input str2 = ");
scanf("%s", str2);

投稿日時 - 2010-06-15 23:50:03

お礼

仰る通りですね。以後このようなミスをせぬよう気をつけます。
ご回答ありがとうございます。

投稿日時 - 2010-06-16 00:10:56

ANo.1

文字列初期化してない所為です。

イキナリ、宣言してその中身見たら、不定値です。(コンパイラ等にも拠りますけど)
以下ですね
>char str1[MAX], str2[MAX];
>
>printf("input str1 = %s", str1);
>scanf("%s", str1);
>printf("input str2 = %s", str2);
>scanf("%s", str2);

普通は、宣言後必ず使う前にmemsetとかで0(NULL)をセットします。
memset(str1,0,sizeof(str1));
memset(str2,0,sizeof(str2));

投稿日時 - 2010-06-15 23:33:34

お礼

完全に凡ミスでした。こんな簡単なことに気がつかなかったとは…。
ご回答ありがとうございました。

投稿日時 - 2010-06-16 00:08:04

あなたにオススメの質問