プロが教える店舗&オフィスのセキュリティ対策術

超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件)

> 「一般的な」と書いたのは、私がC言語の数多くある処理系に精通していないため、本当にそうなのか断定することが出来なかったからです。



標準規格では可能です。
非標準処理系の中にはできないものもあるかもしれませんが、それらは「一般的な」処理系ではありません。
    • good
    • 0

連投ですみませんが、語弊を招きそうなので、更に補足させてください。



「一般的な」と書いたのは、私がC言語の数多くある処理系に精通していないため、本当にそうなのか断定することが出来なかったからです。
それ以外の他意はありません。

ご存じの方がいれば、補足をお願いします。

#chianti1986さん、話の本筋と逸れてすみません。
    • good
    • 0

No.3です。



断定で書いたのは明らかな誤りでした。
一般的なCの仕様上では書けると訂正させてください。
    • good
    • 0

>まず `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])」と同じになり今回のプログラムでは意味が違いますが、書けることは書けます。
    • good
    • 0

> strcmpを使わずに



strncmpとかstrcollとかwcscmpとかを使えばよいだけでは?
スクラッチで書くには実力が不足している気がします。
    • good
    • 0

まず `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)を(値として)比較してみたらどうでしょう?

後はじっくり考えてみてください。
    • good
    • 0

ちょっと突っ込みどころ満載な気はしますけど、とりあえず


strcmp()は文字列の長さを比較する関数ではないですよ。
    • good
    • 0

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は不要にできます。
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A