- ベストアンサー
初歩的なプログラムなんですが・・・
まだ勉強始めたばっかりで色々ネットのページも調べてみたんですがどうしてもわからないのでどなたか教えてもらえませんか?? scanf()関数を用いて同じ長さの文字列を2つ入力して、この2つの文字列が同じ文字列ならば、 「等しい文字列を入力」と画面表示して、異なるならば「異なる文字列を入力」と画面表示したいんですが^^; 実行結果は 同じ長さの文字列を2つ入力しなさい abcde abcde 等しい文字列を入力 のような結果がほしいんです。 どなたかお願いします^^;
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
どの程度C言語レベルをお持ちなのか不明のため、わかりきったことを説明してるかもしれません。 #4さんのおっしゃるように、関数にまかせてしまうのではなく、自力のコーディングでうまく目的を果たすことを今はめざしませんか。 scanf()で入力された二つの文字列の長さが決まっているのか任意なのかでコーディングは変わりますが、二つの文字列は必ず同じ長さであるとしましょう。 (ただし現実のアプリではそのような暗黙了解は危険です。文字長がゼロとかいろいろ例外がありえます) 二つの文字列を先頭から1文字づつ (1)決まった文字数分比較する、あるいは別な方法としては (2) 文字が'\0'(終端) になるまで比較してみませんか。 sasuke2006さんはfor()ループをどこで抜けて、どのタイミングで「違う」「同じ」を表示していいのかが難しいのかな。 例として必ず3文字の入力であるとして、 3文字の途中で異なっていれば 違うことを覚えておきbreak(ループを抜ける)、3文字とも同じであれば同じだということを覚えておいて、どちらだったかを最後の段階で判定してそれぞれを表示して終了してみませんか。 (1) 文字ループで比較する場合は //forまたはwhile文をつかって、ループを抜けたあとに同じ・違うのどちらであったかを判定して結果を表示する。 f=TRUE; // 同じであると仮定しておく。これをセットしないと、文字列が同じであったときfの値は何になっているかわからないから for ( i=0 から3文字分ループ ) { if ( str1[i]とstr2[i]が異なれば) // *p++ などのポインタでまわす方法もありますがここでは説明省略 { f=FALSE/*"違う"ことを覚えて*/; break/*して比較をやめる*/ } } //異なる・同じのいずれでもここ(for文のカッコの後)に落ちてくるので判定の上表示する もし (TRUE) "同じ" else "違う" (2)の終端判定はまた機会があれば... 慣れてくると#5さんのようにエレガントなコーディングができるようになると思いますよ。
その他の回答 (5)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#include<stdio.h> int equals(char *s1, char *s2){ /* 文字列 s1 と s2 が等しい時 非0 そうでない時 0を返す */ while(*s1 && *s2) if(*s1++!=*s2++) return (0); return (*s1==*s2); } void main(void){ char first[64],second[64]; printf("同じ長さの文字列を2つ入力しなさい\n\n"); scanf("%s",first); scanf("%s",second); if(equals(first,second)) printf("等しい文字列を入力\n"); else printf("異なる文字列を入力\n"); }
お礼
二度も答えていただいてありがとうございます♪ でもruturn 0 までしかまだ習ってないのでプログラムの流れがいまいちわかんないです・・・。
- zyakatu
- ベストアンサー率12% (1/8)
はじめまして。なるほど、良い課題に取り組んでいらっしゃるようですね。私も以前同じような問題で悩んだ記憶があります。いろいろと便利な関数はあるのですが。stdio.hのみでの解決をお勧めします。文字列について基礎をきちんと理解してから、もう一度チャレンジしてみてください。その上でfor文、if文を駆使すればできるはずです。それでは頑張ってください。
補足
初めまして^^ 考え方はなんとなく浮かんではいるんです。 char型の変数2つを宣言してその中に入力された文字を文字コードに置き換えてその数字を比較してすべてがイコールなら等しい、違うかったら異なっているって表示したらいいと思うんですがそれをプログラムでどう書けばいいのかがわかりません^^;
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#include<stdio.h> #include<string.h> void main(void){ char first[64],second[64]; printf("同じ長さの文字列を2つ入力しなさい\n\n"); scanf("%s",first); scanf("%s",second); if(strcmp(first,second)==0) printf("等しい文字列を入力\n"); else printf("異なる文字列を入力\n"); }
お礼
ありがとうございます^^ そのプログラムを書いてコンパイルしてみたらちゃんと通って結果もオッケーでした^^ でもstdio.hだけを使って同じ結果を得られるようにしたいんですよね^^; string.hはまだ習ってないんで・・・。
- MasamiH
- ベストアンサー率21% (13/61)
学校などの研究課題だとすれば(不明)具体的な回答するのはよろしくないと思い、考え方だけ.. (かなり具体的かつ初歩的な出力を求めてらっしゃるのでそう思ってしまいました。もしかすると二つの文字列を比較するという課題かと。) 二つの文字列バッファを用意しておいて、それを比較すればいいのでは? forやwhile文で 文字列[i] で回すか、ポインタ++ でいくか。 文字列終端判定やループ回数は strlen()または *p=\0 でできます。 文字列の比較はプログラミングの本にも多数参考になる例題があると思います。
補足
考え方は何となく浮かんでるんですがそれをどうプログラムとして書けばいいのかわかんないです^^; 難しいです・・・
- CTAB
- ベストアンサー率57% (41/71)
うーん、プログラムと離れて久しいのですが、一応 #include<stdio.h> #include<conio.h> void main(void){ int i,CNT; char first[99],second[99]; printf("等しい文字列を入力しなさい\n\n"); printf("一つ目の入力\n"); scanf("%s\n",&first); printf("二つ目の入力\n"); scanf("%s\n",&second); for(i=0,CNT=0;i<99;i++){ if(first[i]==second[i]) CNT++; } if(i==CNT) printf("等しい文字列を入力"); getch(); } こんな感じですかねえ。 本当はポインタとか使ったほうがいいんでしょうけど、こんなところです。 内容的には条件満たしてるというだけですけど、プログラムが走らないということはないと思いますので試してみてください。
お礼
でも早速教えていただいてありがとうございました。 感謝です^^
補足
コンパイラは通ったんですが求める結果にならなかったです^^; 同じ長さの文字列を入力してください、と表示した後に ユーザーがキーボードから任意の文字列を2つ入力してその入力された文字列が等しければ「等しい文字列を入力」異なっていれば「異なった文字列を入力」と表示させたいんです。 説明足らずですいません・・・^^;
お礼
一応次のように出来ました。 アドバイスありがとうございました。 #include <stdio.h> int main(void) { int i,j; char str1[80],str2[80]; printf("同じ長さの文字列を2つ入力しなさい\n"); scanf("%s",str1); scanf("%s",str2); i=0; j=0; while (str1[i]!='\0') { if (str1[i]!=str2[i]) { j++; }i++; } if (j==0) { printf("等しい文字列を入力"); } else { printf("異なる文字列を入力"); } return 0; }