プログラミング ポインタを使った文字列比較
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 =」の右のスペースが文字化け?してしまいます。(半角カタカナや記号が出る)ただ、その後に文字列を入力すると、正しく機能します。
これは何が悪いなのでしょうか、どなたか教えてください。
No.2ベストアンサー
- 回答日時:
>printf("input str1 = %s", str1);
str1を出力することは不要です。"input str1 = " だけでじゅうぶん。
>printf("input str2 = %s", str2);
上に同じ。
>str_compare(str1, str2);
この行は不要です。
>ポインタと間接演算子*を用いた処理を行うこと。
この条件を満たしていないのでは?
ご回答ありがとうございます。
>>>ポインタと間接演算子*を用いた処理を行うこと。
>>この条件を満たしていないのでは?
確かに、添え字を使って誤魔化していますね…
以下のように、str_compare関数の中身だけ変更しました。これでOKですか?
int str_compare(char *s1, char *s2)
{
while (*s1 == *s2){
if (*s1 == '\0')
return 0;
s1++;
s2++;
}
return 1;
}
No.4
- 回答日時:
「ポインタと間接演算子*を用いた処理を行うこと」という条件だけなら, s1[i] とか s2[i] とかを *(s1+i) とか *(s2+i) とかに直せば OKですね>#2.
あるいは「s1[i] というのは規格上 *(s1+i) と等価であり, 明示的にではないが間接演算子をつかっている」と言い張ってみるのもいいかもしれません.
No.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);
No.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));
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- Visual Basic(VBA) VBAで最新のデータを別シートに転記する方法をお教えください。 3 2022/04/07 19:20
- Visual Basic(VBA) VBAで時間(00:00形式)を積算(足し算)したい 1 2022/11/15 17:04
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
C言語のプログラムで、途中で止...
-
fread(),fwrite()等について
-
2進数の表示
-
fscanfの使い方
-
2÷3などの余りについて
-
C言語で%を使わない余りの出し方
-
比較回数と交換回数表示について
-
信頼区間の1.96や1.65ってどこ...
-
nCmの関数
-
複数桁10進数の*桁目だけを抽出...
-
Notepad++の関数リスト表示の変...
-
C言語のfor文です。 繰り返しの...
-
break文でループを一気に抜ける...
-
正負を反転させて出力するプロ...
-
#define _CRT_SECURE_NO_WARNIN...
-
error C2143: 構文エラー : ';'...
-
プログラムでの数字につく”f”の...
-
既定のコンストラクタがありま...
-
hit&bolwのプログラミングがで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
C言語で複数列のデータを1列の...
-
#defineが使用するメモリ領域に...
-
printf による16進表示について
-
空白を含んだ文字列がうまく格...
-
C言語のプログラムで、途中で止...
-
プログラミングの授業の課題です
-
char型2つを結合し、short型に...
-
C言語でのCSVファイルの読み出...
-
矢印キーを押下してコンソール...
-
【C言語】全角文字の配列を、全...
-
エラーについて質問です。
-
リストの作成と出力(C言語)
-
バイナリファイル(画像)のよみ...
-
[C]セグメンテーションエラー:...
-
WinInetのInternetOpenUrl関数...
-
VC++でSQLへSELECT文を送ったの...
-
受信データから必要な部分のみ...
-
c言語で文書を読み込み、単語の...
-
reallocでエラー
おすすめ情報