• ベストアンサー

初歩的なプログラムなんですが・・・

まだ勉強始めたばっかりで色々ネットのページも調べてみたんですがどうしてもわからないのでどなたか教えてもらえませんか?? scanf()関数を用いて同じ長さの文字列を2つ入力して、この2つの文字列が同じ文字列ならば、 「等しい文字列を入力」と画面表示して、異なるならば「異なる文字列を入力」と画面表示したいんですが^^; 実行結果は 同じ長さの文字列を2つ入力しなさい abcde abcde 等しい文字列を入力 のような結果がほしいんです。 どなたかお願いします^^;

質問者が選んだベストアンサー

  • ベストアンサー
  • MasamiH
  • ベストアンサー率21% (13/61)
回答No.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さんのようにエレガントなコーディングができるようになると思いますよ。

sasuke2006
質問者

お礼

一応次のように出来ました。 アドバイスありがとうございました。 #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; }

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

#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"); }

sasuke2006
質問者

お礼

二度も答えていただいてありがとうございます♪ でもruturn 0 までしかまだ習ってないのでプログラムの流れがいまいちわかんないです・・・。

全文を見る
すると、全ての回答が全文表示されます。
  • zyakatu
  • ベストアンサー率12% (1/8)
回答No.4

はじめまして。なるほど、良い課題に取り組んでいらっしゃるようですね。私も以前同じような問題で悩んだ記憶があります。いろいろと便利な関数はあるのですが。stdio.hのみでの解決をお勧めします。文字列について基礎をきちんと理解してから、もう一度チャレンジしてみてください。その上でfor文、if文を駆使すればできるはずです。それでは頑張ってください。

sasuke2006
質問者

補足

初めまして^^ 考え方はなんとなく浮かんではいるんです。 char型の変数2つを宣言してその中に入力された文字を文字コードに置き換えてその数字を比較してすべてがイコールなら等しい、違うかったら異なっているって表示したらいいと思うんですがそれをプログラムでどう書けばいいのかがわかりません^^;

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#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"); }

sasuke2006
質問者

お礼

ありがとうございます^^ そのプログラムを書いてコンパイルしてみたらちゃんと通って結果もオッケーでした^^ でもstdio.hだけを使って同じ結果を得られるようにしたいんですよね^^; string.hはまだ習ってないんで・・・。

全文を見る
すると、全ての回答が全文表示されます。
  • MasamiH
  • ベストアンサー率21% (13/61)
回答No.2

学校などの研究課題だとすれば(不明)具体的な回答するのはよろしくないと思い、考え方だけ.. (かなり具体的かつ初歩的な出力を求めてらっしゃるのでそう思ってしまいました。もしかすると二つの文字列を比較するという課題かと。) 二つの文字列バッファを用意しておいて、それを比較すればいいのでは? forやwhile文で 文字列[i] で回すか、ポインタ++ でいくか。 文字列終端判定やループ回数は strlen()または *p=\0 でできます。 文字列の比較はプログラミングの本にも多数参考になる例題があると思います。

sasuke2006
質問者

補足

考え方は何となく浮かんでるんですがそれをどうプログラムとして書けばいいのかわかんないです^^; 難しいです・・・

全文を見る
すると、全ての回答が全文表示されます。
  • CTAB
  • ベストアンサー率57% (41/71)
回答No.1

うーん、プログラムと離れて久しいのですが、一応 #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(); } こんな感じですかねえ。 本当はポインタとか使ったほうがいいんでしょうけど、こんなところです。 内容的には条件満たしてるというだけですけど、プログラムが走らないということはないと思いますので試してみてください。

sasuke2006
質問者

お礼

でも早速教えていただいてありがとうございました。 感謝です^^

sasuke2006
質問者

補足

コンパイラは通ったんですが求める結果にならなかったです^^; 同じ長さの文字列を入力してください、と表示した後に ユーザーがキーボードから任意の文字列を2つ入力してその入力された文字列が等しければ「等しい文字列を入力」異なっていれば「異なった文字列を入力」と表示させたいんです。 説明足らずですいません・・・^^;

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 3つほどプログラムをおしえてください。

    (1)100までの整数をいくつか入力し、10刻みでの個数を表示し、負の数が入力されると整数の入力を終わるプログラムです。各範囲の個数は配列に格納する。 実行結果 65 30 21 95 5 -1 0--- 9 : 1 10--- 19 : 0 20--- 29 : 1 30--- 39 : 1 40--- 49 : 0 50--- 59 : 0 60--- 69 : 1 70--- 79 : 0 80--- 89 : 0 90---100 : 1 (2)数字の文字列を入力し、その文字列に含まれる各数字(文字)'0','1',~'9'の個数を表示するプログラムの作成。 実行結果 1231234567 0: 0 1: 2 2: 2 3: 2 4: 1 5: 1 6: 1 7: 1 8: 0 9: 0 (3) 変数xは、0~1までの0.01刻みの値(101個)を取るとする。このとき、2次関数 f(x)=3x^2+2x+1の値が2.0<f(x)<3.0となるxの値をの個数を求めるプログラムの作成。ただし、xを引数としf(x)の値を返す関数を作成して、それを使用する。 実行結果 number=21 やってるうちにわけがわからなくなってしまいます。どなたかよろしくおねがいします。

  • おしえてください5

    main関数内でchar型の変数word[20]を宣言し,scanfを用いて文字列を入力する. 再帰呼び出しでword内の文字列を逆順に表示する関数call_nextを作製し, 入力した文字列を逆順に表示せよ. ※グローバル変数は用いないこと.グローバル変数を用いた場合は0点とする. ※通常scanfではスペースは読み込めないが  scanf(" %[^\n]", str);  とすることで,スペースも読み込みができる. <実行結果例1> Input word(20). -> society society yteicos <実行結果> Input word(20). -> RATS & STAR RATS & STAR RATS & STAR

  • 文字列の判別させるプログラム

    長さの等しい2つの文字列を入力しては、片方を何文字か左に回転したときにもう一方と一致するかどうか調べる関数rotateLを作るのですが、よくわかりません。 たとえば、 文字列1=abcde 文字列2=bcdea なら 一回転で一致 となる関数なのですが、この判別はどのようにすればいいのですか?

  • C言語のプログラムみてください(isdigit)

    質問は2つあります。 (1) scanf関数を使って、 時給: と表示されたところに一文字打ち込み、数字以外ならばもう一度 時給: と表示されるプログラムを作りたいです。 以下のプログラムなら、 isdigit関数は数字を渡せば0以外の数を返す(真)から、 while文の条件式(偽)のようにすれば、 ・数字を一文字うちこめばwhile文の条件式にあてはまらない、すなわち下のプログラムではisdigit(payment) != 0 となり、return 0; が実行され、プログラムが終わる ・数字以外を一文字打ち込めばwhile文の条件式が真となり、printf関数とscanf関数が実行されて入力待ち状態になる と思ったのですが、どうやら違うようです。実際には ・数字一文字打てばまた入力待ちになる ・数字以外を一文字打てば永遠にprintf関数とscanf関数が実行される のはなぜでしょうか。 #include <stdio.h> #include <ctype.h> int main(void){ int payment; do{ printf("時給[円]:"); scanf("%d",&payment); } while (isdigit(payment) ==0) ; return 0; } (2) 実際には、一文字の制限なく、数字以外の何かを入力したら、再び入力待ちになるプログラムを作りたいのですが、これはどうしたらいいのでしょうか。 つまり 時給: のところに数字以外ならまた 時給: となるようにしたいのです。お願いします。

  • 検索させるプログラムです。

    文字列を入力させて、その後に検索キー入力をし、先ほど入力した文字列のなかから 一致するものを検索するプログラムです。 #include <stdio.h> int searchidx(char a[],char key) { int i=0,j=0; a[3]=key; for(i=0;i<3;i++){ if (a[i] == key){ j++; break; } } if(j==0){ return(-1); }else{ return(i); } } int main(void) { int a,i; char ky=0; char x[3]; printf("3個の文字を入力してください。\n"); for (i = 0; i < 3; i++) { printf("x[%d]:", i); scanf("%s", &x[i]); } printf("検索キー:"); scanf("%s", &ky); a=searchidx(x,ky); if (a == -1){ puts("一致しません。"); }else{ printf("%d\n",a); printf("%s\n",x[a]); } } メイン関数で文字列を入力させ、その配列とキー値をサーチ関数に渡して 一致した時の配列の添え字をaに返してメイン関数で文字列の配列のその添え字x[a]で表示されるのではないか?と思ってそうしてるつもりなのですが 実行してみると最後の一致した結果を表示させるところでエラーがでます。 表示させるところの前のprintfで一致するものの要素数が帰ってくるかどうかのチェックを入れてますが ちゃんと添え字番号は正しく返ってくるのになぜ最後の printf("%s\n",x[a]); ではダメなのでしょうか? それとscanfって%sのときは&いらなかったと思うのですが この場合&を入れないとエラーになってしまいます。

  • 文字列長について

    教えて下さい。 Len関数を使って文字列の長さを調べるとき Len("ABCDE") Len("ABCDE") を実行するとどちらも5が返ってきますよね? でも 5 10 と返ってほしいんです。 なにか方法ありませんか? よろしくお願いします。

  • 任意の文字列を入力し、文字列に母音(a,i,u,e,o)が何個含まれているかをint型数値として返すような関数VowelNumber()を作成せよ。 また,この関数を使用して,キーボードから入力された文字列に母音が何個含まれているかを表示するプログラムを作成せよ。 <実行結果> 文字列の入力-->>university 母音は4個含まれています。

  • このプログラムどうやったら??

    引数として受け取った文字列を逆順にした文字列に変換する関数なんですけども、全くわかりません。教えていただけませんか?? つまりは、キーボードから入力した文字列を逆順に表示させるってことなので、 void str_reverse(char src[]) を使えばいいのかと思うのですが、、、 Osaka Dome→emoD akasO みたいな感じなんですけれども。。。 お願いします!

  • ASPからexeプログラムへ引数

    ASPの超初心者です。 IIS上のASPから WWWから変数での文字列を test.exeに、引数を与えて実行することは可能ですか? また、それを実行した結果をASPでWWWに表示させたいの ですが、可能ですか? よろしければ、簡単な方法や関数等を教えてくだされば 幸いです。 よろしくお願いします。

  • プログラム

    文字列str内のすべての英字を大文字に変換する関数および小文字に変換する関数void str_toupper(char *str)    void str_tolower(char *str) を作成したいのですが、検討つかなくて困っています、、 表示例としては、 文字列を入力:asDFgH 大文字:ASDFGH 小文字:asdfgh