超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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- 中学校 CP室 3 2023/02/10 23:33
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- 電気工事士 【電気設備設計士さんに液晶パネルタイプの電力量計に関する質問です】キュービクル内の液晶 1 2023/07/24 18:16
- pixiv 腐女子の方に質問です(できれば二次創作される方) 2 2022/06/20 04:47
このQ&Aを見た人はこんなQ&Aも見ています
-
賃貸で可能な古民家風レトロな部屋作りのコツ!改めて知る畳の高い機能性と魅力も紹介
畳の部屋を雰囲気のよい部屋に仕上げたい!賃貸住宅でもできる古民家風のレトロな部屋作りのコツを伺った。
-
C言語のポインターに関する警告
C言語・C++・C#
-
構造体のメンバをfor文で回したい
C言語・C++・C#
-
エラーの意味は? Lvalue required
C言語・C++・C#
-
-
4
strstrを利用しない文字列検索について
C言語・C++・C#
-
5
charでの計算?
C言語・C++・C#
-
6
先頭アドレスとは何ですか?
C言語・C++・C#
-
7
数字以外が入力されたらエラー文を出したい。
C言語・C++・C#
-
8
(C言語)関数の中で文字列比較できない。
C言語・C++・C#
-
9
sscanfとscanfの違いがよくわからないのですが、簡単に優しく教えて下さい。 お願い致します。
C言語・C++・C#
-
10
関数から配列を返すには?
C言語・C++・C#
-
11
C言語 exitの使い方
C言語・C++・C#
-
12
再起呼び出しの回数をカウントするプログラム
C言語・C++・C#
-
13
正負を反転させて出力するプログラム
C言語・C++・C#
-
14
scanf(%s", buf);でスペースを含んだ文字"
C言語・C++・C#
-
15
【gcc・cygwin】multiple definitionエラーの解決法
C言語・C++・C#
-
16
ファイルから読み込んだデータを構造体に格納できますか?
C言語・C++・C#
-
17
NULLの定義について
C言語・C++・C#
-
18
str系関数を使わずに二つの文字を結合する方法
C言語・C++・C#
-
19
doubleの変数にintとintの割り算の結果を代入するとき
C言語・C++・C#
-
20
init関数の意味
C言語・C++・C#
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
10個出力で改行したいのですが...
-
strcmp
-
error C2143: 構文エラー : ';'...
-
スレッドとメッセージキューに...
-
C言語 タイマーのソースについて
-
C言語プログラミング
-
Cプログラムについて
-
インクリメント演算子をprintf...
-
コマンドラインに出力した文字...
-
C言語の数値入力
-
コンパイルエラーについて
-
c言語でAからZまでを表示する...
-
hit&bolwのプログラミングがで...
-
プログラミング言語C
-
C言語のヘッダーファイルの作成...
-
C++ 二次関数の重解、虚数解が...
-
unsigned int型について
-
scanfで正しい値を入力できない
-
int型 00 を表示するのに0とな...
-
関数について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
【C言語教えてください】sin波...
-
printf で二進表示を行いたい。
-
c言語でAからZまでを表示する...
-
コマンドラインに出力した文字...
-
strcmp
-
4の倍数を論理演算で表す。。
-
C言語での、年複利の計算方法...
-
C言語 プログラミング
-
scanfに文字が入力されたときに...
-
hit&bolwのプログラミングがで...
-
%P と %X の違い
-
unsigned int型について
-
printf( " %2d", p * q );
-
cshの文字列操作(0埋め)
-
改行について 1行に何個かづ...
-
8人分のテストの点数を入力し、...
-
入力したお金の金額からお札の...
-
三角形の判別
-
テキストカーソル位置の取得
おすすめ情報