• 締切済み

皆様に、C言語についての質問です・・><

皆様に、C言語についての質問です・・>< この前も質問しましが、まだできないので>< 後、少し問題にもミスがあったので書き直しました プログラミングの内容は以下のようなものです。 以下の実行結果をもとにプログラミングしなさい。 char m[30]; 実行結果 文字,個数==>A,5 文字,個数==>b,3 文字,個数==>c,1 文字,個数==>E,2 文字,個数==>^Z 文字列:AAAAAbbbcEE ↓は自分でやったプログラムです>< #include<stdio.h> void main(void) { char m[30],moji; int kosu,i; printf("文字,個数==>"); fflush(stdin); scanf("%c,%d",&moji,&kosu); i=0; while(m[i]!=EOF) { printf("文字,個数==>"); scanf("%c,%d\n",&moji,&kosu); m[i]=moji; i++; } m[i]='\0'; printf("文字列:%s\n",m); return; } ^z押しても終了できません>< 表示もおかしいです・・・・ 訂正お願いいたします><

みんなの回答

noname#144013
noname#144013
回答No.9

こんにちは。 > ^z押しても終了できません [Ctrl]+[Z}などの制御文字の入力を認識するためには、環境(OS、処理系など) に依存した処理を行う必要があると思います。 ですので、環境を明記して頂かないと具体的な回答はできないと思います。 下記(リンク先参照)は、「OS=Windows系」+「処理系=VC++系」に限定した サンプルソースです。環境が合えば、宜しければ検証してみて下さい。 注1)お使いのWindowsやVC++のバージョンによっては期待した動作にならない   かもしれません。 注2)Windows系の言語処理系(BCC、MinGWなど)なら動作するかもしれません。 注3)Unicodeには対応していません。 ■サンプルソース(リンク先参照) http://ideone.com/z9fhd ■サンプルソースの補足 1)[Ctrl]+[Z]の入力部分を、「文字、個数」の入力部分と別けて処理しています。 2)[Ctrl]+[Z]の入力部分では、環境依存のコンソール入出力関数「_getch()」を   使用しています。 以上です。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.8

あと、せっかく入力した「個数」をまったく使ってませんね。

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.7

ちょいと前後してしまいましたが… >gets()など使用しても、^Z +(エンター)としないと ^Zだけでは認識されないのでは?。 はい。エンターキーで確定しないと止まってますね。 それ(エンターキーで確定)すらもナシで…だと、結構面倒なことになるやも知れず。 # ラインエディタみたいな? 仕様面であいまいな部分がイタイですねぇ。

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.6

>だから, scanf("%c,%d\n", &moji, $kosu); の最初の moji に入力せず End-of-file を入れたら moji の値は変らないはず>#3. ちびっとヤってみました。 確かに、変化しませんね。 # scanf()なんぞ、ここしばらく使っていないので…。 となると、scanf()でEOF判定はちょっと面倒ですかねぇ。 # というか、ステップ実行したらscanf("%c,%d\n", &moji, &kosu);の"\n"のせいで微妙な挙動した。 fgets()とsscanf()でできたが…まぁ、質問者さんにはもう少し自分で考えていただきましょう。

  • noyuo
  • ベストアンサー率39% (33/84)
回答No.5

他の方のご指摘のとおりだと思います。(sscanf()を使うなど。) ^Zの入力を待つループ  指定した文字数分をmに加えるループ のネストした、2つのループが必要です。 EOF(^Z?)は、mに格納する前には判定しなくてはいけません。 あと2点、処理系によるかもしれませんが、 scanf()は、指定した書式分のデータが揃わないとリターンしてこないかもしれない。 gets()など使用しても、^Z +(エンター)としないと ^Zだけでは認識されないのでは?。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

scanf は「うまく入力できない」場合, 変数の値を変えないはず (とちょっと前にも書いたなぁ) だから, scanf("%c,%d\n", &moji, $kosu); の最初の moji に入力せず End-of-file を入れたら moji の値は変らないはず>#3. ちなみにいくつかの条件がかさなると m[i]!=EOF が常に成り立ったりもする. いずれにしても, 各種の標準ライブラリ関数の仕様を再確認する必要はある. まあ, いずれにしても作ろうとするプログラムの仕様そのものが謎だから....

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.3

>fflush(stdin); 未定義動作です。 何が起こっても文句言えません。 >scanf("%c,%d",&moji,&kosu); 受け取ったkosu、未使用ですがよろしいので? >while(m[i]!=EOF) 未初期化のm[]の値に、たまたまEOFが見つかるまでループします。 んで、m[i]がバッファオーバーランする可能性がとても高いです。 iが30以上になったらどこに書き込まれますかね? # どうみても仕様のミスっぽいですけど。 >^z押しても終了できません>< scanf()での入力になりますから…mojiにEOFが入ります……かね? 試したコトはありませんけど。 ちなみに、LinuxとかだとCtrl+ZではEOF入力できませんが、そこらヘンは問題ないんですよね? 環境書かれていませんけど。 # fgets()で文字列として取り込んで処理すべきなんじゃないかと思うんですが… # sscanf()で取り出せるでしょうし…。(sscanf()につっこむ前にEOFの判定は必要でしょうけど)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

おっと。 >ゴミとEOFとが等しいことを期待してはいけません。 「等しくないことを」が正しいです。 要するに、ゴミが入っている状態で何かと比較することは 大いにまずい、という意味です。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

>char m[30],moji; >while(m[i]!=EOF) m[30]を定義した際、中身はゴミ(何が入っているかわからない)です。 ゴミとEOFとが等しいことを期待してはいけません。

関連するQ&A

専門家に質問してみよう