プロが教えるわが家の防犯対策術!

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

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

A 回答 (4件)

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



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

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

上に同じ。

>str_compare(str1, str2);

この行は不要です。

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

この条件を満たしていないのでは?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
>>>ポインタと間接演算子*を用いた処理を行うこと。
>>この条件を満たしていないのでは?
確かに、添え字を使って誤魔化していますね…
以下のように、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

「ポインタと間接演算子*を用いた処理を行うこと」という条件だけなら, s1[i] とか s2[i] とかを *(s1+i) とか *(s2+i) とかに直せば OKですね>#2.


あるいは「s1[i] というのは規格上 *(s1+i) と等価であり, 明示的にではないが間接演算子をつかっている」と言い張ってみるのもいいかもしれません.
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/06/16 19:40

> 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);
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/06/16 00:10

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



イキナリ、宣言してその中身見たら、不定値です。(コンパイラ等にも拠りますけど)
以下ですね
>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));
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/06/16 00:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!