
超C言語初心者です。strcmpを使わずに文字列を比較する文を書いているのですが、途中でわからなくなりました。
宜しければご指摘お願いします。
#include<stdio.h>
int main(){
char cp1[100],char2[100];
int i=0;
int j=0
printf("1つ目の文字列:\n");
scanf("%s\n",cp1);
printf("2つ目の文字列:\n");
scanf("%s\n",cp2);
while(cp1[i]=='\0' || cp2[j]=='\0'||cp1[i]==cp2[j]=='\0'){
cp1[i++];
cp2[j++];
}
if(cp[i]==cp2[j]=='\0'){
printf("同じ文字数\n);
}else if (cp1[i]=='\0'&&cp2[j]!='\0'){
printf("2つ目の方が大きい\n);
}else if (cp2[j]=='\0'&&cp1[i]!='\0'){
printf("1つ目の方が大きい\n);
}
exit(0);
}
と今書いています。間違いだらけでしょうが、お願いします!!
A 回答 (8件)
- 最新から表示
- 回答順に表示
No.8
- 回答日時:
> 「一般的な」と書いたのは、私がC言語の数多くある処理系に精通していないため、本当にそうなのか断定することが出来なかったからです。
標準規格では可能です。
非標準処理系の中にはできないものもあるかもしれませんが、それらは「一般的な」処理系ではありません。
No.7
- 回答日時:
連投ですみませんが、語弊を招きそうなので、更に補足させてください。
「一般的な」と書いたのは、私がC言語の数多くある処理系に精通していないため、本当にそうなのか断定することが出来なかったからです。
それ以外の他意はありません。
ご存じの方がいれば、補足をお願いします。
#chianti1986さん、話の本筋と逸れてすみません。
No.5
- 回答日時:
>まず `cp1[i]==cp2[j]=='\0'` なんて書き方は出来ません。
LOHAさん嘘を書かないでください。
書けます、文法上合法です。意味はhitomuraさんの書いたとおり「(cp1[i]==cp2[j])=='\0'」の意味で、「(cp1[i]!=cp2[j])==0」、「!(cp1[i]!=cp2[j])」、「(cp1[i]!=cp2[j])」と同じになり今回のプログラムでは意味が違いますが、書けることは書けます。
No.3
- 回答日時:
まず `cp1[i]==cp2[j]=='\0'` なんて書き方は出来ません。
ちゃんと `cp1[i] == '\0' && cp2[j] == '\0'` と書きましょう。
>while(cp1[i]=='\0' || cp2[j]=='\0'||cp1[i]==cp2[j]=='\0'){
比較が逆です。
比較した結果がtrueの時にループが回ることを思い出してみてください。
>cp1[i++];
>cp2[j++];
配列の要素番号の部分でインクリメントするのはおかしいです。
普通に i++; j++; でよいでしょう。
>if(cp[i]==cp2[j]=='\0'){
>printf("同じ文字数\n);
>}else if (cp1[i]=='\0'&&cp2[j]!='\0'){
>printf("2つ目の方が大きい\n);
>}else if (cp2[j]=='\0'&&cp1[i]!='\0'){
>printf("1つ目の方が大きい\n);
>}
だと、同じ長さの時が抑えられていません。
それと、アルゴリズムも微妙ですね。
while (cp1[i] != '\0' || cp2[i] != '\0')
++i;
として、iの位置の文字(char)を(値として)比較してみたらどうでしょう?
後はじっくり考えてみてください。
No.1
- 回答日時:
1.
while文はカッコ内の条件が成立「している間」処理を繰り返します。成立「するようになるまで」ではありません。
なお、C言語では「条件が成立『するようになるまで』繰り返す構文」はありません。そのような処理が必要になった場合はその条件の否定が成立している間処理を繰り返すように書きます。
2.
演算子の結合順の関係上、
cp1[i]==cp2[j]=='\0'
という式は
(cp1[i]==cp2[j])=='\0'
と解釈されます。それは多分あなたの望む結果とならないでしょう。
というか、その前のほうで2文字列が終端に来たことをチェックしているのだから、ここでは別のことをチェックすべきです。
3.
cp1[i++];
cp2[j++];
という文は確かにあなたの想定どおり動きます。しかし、
i++;
j++;
で十分です。
4.
途中で文字列が違っていた場合(たとえば"abc"と"abz")の処理が抜けています。
5.
変数jは不要にできます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
構造体メンバの個数
-
コンパイルエラーについて
-
アドレスの比較について
-
getchar()マクロによる空白文字...
-
三角形の判別
-
3つの入力した数値の大小比較...
-
C++でfprintfやprintf,fopenな...
-
8人分のテストの点数を入力し、...
-
wsprintf関数(書式制御文字列...
-
LU分解法のピボット選択機能実...
-
c言語で2000年以降カレンダーを...
-
C言語に関して質問です。 次の...
-
%P と %X の違い
-
既約分数の表示プログラム
-
10個出力で改行したいのですが...
-
boolean型の戻り値は可能か
-
C言語 繰り返しの問題
-
Visual Sutdio 2017 でのC言語...
-
文字と数字の判定について
-
数当てゲームを作っているのですが
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
c言語でAからZまでを表示する...
-
(C言語)めちゃくちゃな値にな...
-
コマンドラインに出力した文字...
-
コンパイルエラーについて
-
コマンドプロンプトがすぐ消える
-
勝率をプログラムに
-
テキストカーソル位置の取得
-
三角形の判別
-
【C言語教えてください】sin波...
-
4の倍数を論理演算で表す。。
-
C言語で、「自然数nを入力し、n...
-
入力したお金の金額からお札の...
-
cshの文字列操作(0埋め)
-
switch分のケースを範囲数?に...
-
scanfに文字が入力されたときに...
-
プログラミングについての質問です
-
unsigned int型について
-
ダブルポインタで2次元配列を作成
-
円の面積を求めるプログラミン...
おすすめ情報