- ベストアンサー
プログラミングでポインタを使った文字列比較
- プログラミングでポインタを使用して文字列を比較する方法について説明します。
- 与えられた2つの文字列が等しい場合、0を返し、等しくない場合は1を返す関数str_compareを作成します。
- しかし、プログラムを実行すると、文字化けが発生し、正しく機能しません。この問題の原因と解決方法を教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>printf("input str1 = %s", str1); str1を出力することは不要です。"input str1 = " だけでじゅうぶん。 >printf("input str2 = %s", str2); 上に同じ。 >str_compare(str1, str2); この行は不要です。 >ポインタと間接演算子*を用いた処理を行うこと。 この条件を満たしていないのでは?
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
「ポインタと間接演算子*を用いた処理を行うこと」という条件だけなら, s1[i] とか s2[i] とかを *(s1+i) とか *(s2+i) とかに直せば OKですね>#2. あるいは「s1[i] というのは規格上 *(s1+i) と等価であり, 明示的にではないが間接演算子をつかっている」と言い張ってみるのもいいかもしれません.
お礼
ご回答ありがとうございます。勉強になりました。
- hanabutako
- ベストアンサー率54% (492/895)
> 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);
お礼
仰る通りですね。以後このようなミスをせぬよう気をつけます。 ご回答ありがとうございます。
- t_nojiri
- ベストアンサー率28% (595/2071)
文字列初期化してない所為です。 イキナリ、宣言してその中身見たら、不定値です。(コンパイラ等にも拠りますけど) 以下ですね >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));
お礼
完全に凡ミスでした。こんな簡単なことに気がつかなかったとは…。 ご回答ありがとうございました。
お礼
ご回答ありがとうございます。 >>>ポインタと間接演算子*を用いた処理を行うこと。 >>この条件を満たしていないのでは? 確かに、添え字を使って誤魔化していますね… 以下のように、str_compare関数の中身だけ変更しました。これでOKですか? int str_compare(char *s1, char *s2) { while (*s1 == *s2){ if (*s1 == '\0') return 0; s1++; s2++; } return 1; }