Ctrl-Zについて

このQ&Aのポイント
  • Ctrl-Zについての説明とエラー処理方法について解説します。
  • Ctrl-Zを入力すると終了せずにエラー処理が実行されます。エラー処理でCtrl-Zを検出して終了する方法について説明します。
  • Ctrl-Zを途中で入力しても成功メッセージを出力しないようにする方法を解説します。
回答を見る
  • ベストアンサー

ctrl-zについて

int main(void) { char *moji; while (fgets(moji, 100, stdin) != NULL)) { printf("success"); } return 0; } この場合、(ctrl+z)を入力すると何も出力されないで終了しますよね? でも、aoijfeoifh(ctrl-z)とかって(ctrl-z)を途中で入力するとsuccessを出力してから終了するじゃないですか。successを出力しないで終了したいんですけど、どうすれば良いのでしょうか? エラー処理で、文章中にctrl-zがあった場合はエラーとして何も出力しないで終了したいということです。

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

  • ベストアンサー
回答No.1

行末に改行があるか否かで判断できそうです。

golden2006
質問者

お礼

ありがとうございます。 while (fgets(moji, 100, stdin) != NULL) { if (moji[strlen(moji) - 1] == '\n') { printf("success\n"); } else { printf("Ctrl+Zが入力されたので終了します\n"); } } ってことですよね?もう一つ質問良いでしょうか?この場合だと、文中に(ctrl-z)が入力されるとエラーメッセージを表示するようにしていますが、最初に(ctrl-z)が入力された場合にも同様のエラーメッセージを出力してから終了することは可能でしょうか?

golden2006
質問者

補足

出来ました。

関連するQ&A

  • エラーのチェックについて

    1~10の数字以外が出たら、再入力を促すようにしたいのですが、上手くいかないので教えてください。 int main(void) { char buf[MAX], moji[MAX]; int n, num; printf("1から10の番号を入力してください:"); while (1) { fgets(buf, MAX, stdin); // 文字列の読み込み n = sscanf(buf, "%d%s", &num, moji); // 文字列から変換 if (num >= 1 && num <= 10 && n == 1) { // 範囲外のエラーチェック break; // 正なら終了 } else { // 間違っていたら入力し直し printf("1から10の番号を入力してください:"); } } 以上のようにして、aや11, ctrlキー+zを入力してEnterを押したときは良いのですが、aの後に続けてctrlキー+zを入力してEnterを押したらelseのprintfがずっと出力され続けてしまいます。それ以外に自分で試した入力の中にはエラーは出ませんでした。ctrlキー+zのことを良く理解していないということもあるのかもしれません。

  • 終了条件Ctrl+zについて,結果表示ついて(C言語)

    こんにちは<_ _> 自己参照構造体に関する問題を解いています。 入力したデータとは逆順につながったリストを作成するという 問題で、結果はともかく逆順表示に出力できましたが 微妙なところでNGが出ています。 まず、 (1)「Ctrl+z」一回で終了しなければならない    以下のプログラムでは二回Ctrl+zを入力しないと    入力が終了できません。 (2)入力時並列させること    以下のプログラムでは入力時    「name tell name tell ・ ・     Ctrl+z」    と入力しなければなりませんが 「name tell name tell」 という風に入力しなければなりません・・・ (3)変数を変化、増減させてはならない     並列させるために変数増やそうと思ったら     bufferだけでやらなければならないみたいです・・・ 三時間ぐらい調べて悩みましたがうまくいきませんでした どうしたら以上のようにできるのかご指導、ご鞭撻のほどを どうかよろしくお願いします<_ _> #include<stdio.h> #include<malloc.h> struct tfield{ char name[20]; char tel[20]; struct tfield *pointer; }; struct tfield *talloc(void); int main(void) { struct tfield *head,*p; char buffer[BUFSIZ]; head=NULL; while(1){ p=talloc(); if( p == NULL ){ printf( "メモリを確保できません。\n" ); _exit( 0 ); } if(scanf("%s",&buffer)==EOF){ break; strcpy(p->name, buffer); } buffer=0; if(scanf("%s",&buffer)==EOF){ break; strcpy(p->tel, buffer); } p->pointer = head; head = p; } if(head != NULL){ p=head; while(p!=NULL){ printf("%6s %s\n",p->name,p->tel); p=p->pointer; } } return 0; } struct tfield *talloc(void)    /*記憶領域の取得*/ { return (struct tfield *)malloc(sizeof(struct tfield)); }

  • scanfの後のfgetsについて

    #include <stdio.h> int main(void) { char name[10]; int no; printf("ナンバーを入力してください: "); scanf("%d",&no); /* 35を入力 */ printf("文字列を入力してください: "); fgets(name,10,stdin); /*入力できない*/ return 0; } この例文だと、fgets関数が改行コードを読み取って、終了してしまい文字列入力が出来ないみたいなんですが、scanfの後にfgetsを使うような(scanfとfgetsの間にscanfの残した?改行コードを取り除く方法)処理はどのような方法があるのでしょうか? 試しにfgets文を2度書いたら思っていた動作をしてくれたのですが、はたしてfgets文を2度書くというような事をしていいものなのでしょうか?見た目もなんだか変な感じですし。。↓ #include <stdio.h> int main(void) { char name[10]; int no; printf("ナンバーを入力してください: "); scanf("%d",&no); /* 35を入力 */ printf("文字列を入力してください: "); fgets(name,10,stdin); fgets(name,10,stdin);  /*入力できる*/ return 0; }

  • C言語におけるfgetsを用いたループ処理について

    C言語において、文章を読み込むためにfgetsを用いて下記のプログラムを書いたのですが、*において入力を受け付けなくなります。 これを解消する方法はないでしょうか? ちなみにコンパイラはBBC、開発環境はVistaです。 なお、簡略のため#include,main等は省略しています。 //以下プログラム #define SIZE 16384 char moji[SIZE] = {""}; char buf[SIZE]; //EOF(^Z)になるまで、文字列を受け取る while(fgets(buf, sizeof(buf), stdin) != NULL){ if(sizeof(moji) < strlen(moji) + strlen(buf)) break; strcat(moji, buf); }; getchar(); //* //プログラムここまで

  • fgets

    c言語初心者です。 char s[20]; fgets(s,20,stdin); printf("%s",s); のようなプログラムで、 20以上の入力をしたらエラーしますよね? それをもし入力したとしてもエラーしないで、20文字出力させるようにしたいのですが何か方法はありますか? いろんなサイトを見たり本を読んでもわかりません。 ちなみにlinuxで使いたいです。

  • 何故オーバーフロー??

    http://oshiete1.goo.ne.jp/qa4423673.html さらに続きになります。 #include<stdio.h> #include<string.h> #define NAME 256 // 暫定的に最大値を決めてます int Convert(const char* pInFileName, const char* pOutFileName); int ReConvert(const char* pInFileName, const char* pOutFileName); int main(){ int a,ret=-1; char InFileName[NAME]; // 入力ファイル名 char OutFileName[NAME]; // 出力ファイル名 FILE *pInFileName; // 入力ファイルポインタ FILE *pOutFileName; // 出力ファイルポインタ printf("1:コンバート 2:リコンバート\n"); scanf("%d",&a); /***** 入力ファイル名入力 *****/ printf("\n@@@@@入力ファイル名入力\n"); scanf("%s",&InFileName); // 入力ファイルオープン if((pInFileName=fopen(InFileName,"rb"))==NULL){ printf("ファイルがありません\n"); return -1; } /***** 出力ファイル名入力 *****/ printf("\n@@@@@暗号化後ファイル名入力\n"); scanf("%s",&OutFileName); // 出力ファイルオープン if((pOutFileName=fopen(OutFileName,"r"))!=NULL){ // read出来るのなら既にファイルあるという事なのでエラーにする printf("同名のファイルが既にあります\n"); return -1; } pOutFileName=fopen(OutFileName,"wb"); // 1:コンバート // 2:リコンバート // 1,2以外:終了 if(a==1){ ret=Convert((const char*)pInFileName,(const char*)pOutFileName); } else if(a==2){ ret=ReConvert((const char*)pInFileName,(const char*)pOutFileName); } if(ret==0){ printf("正常終了\n"); } else{ printf("異常終了\n"); return -1; } printf("数字+エンターで終了します\n"); scanf("%d",&a); fclose(pOutFileName); fclose(pInFileName); return 0; } /*****コンバート*****/ int Convert(const char* pInFileName, const char* pOutFileName) { unsigned char moji; while(1) { if(fread( &moji, 1, 1, (FILE*)pInFileName )>0){ fprintf((FILE*)pOutFileName,"%02x",moji); } else break; } return 0; } /*****リコンバート*****/ int ReConvert(const char* pInFileName, const char* pOutFileName) { char moji16[3]; // 16進表記 char moji10[4];★★★★★★★★★★ long i,j; while(1) { if(fread( moji16, 1, 2, (FILE*)pInFileName )>0){ for(i=0,j=0;i<2;i+=2,j++){ sscanf(&moji16[i], "%2x", moji10); } fprintf((FILE*)pOutFileName,"%c",moji10); } else break; } return 0; } 上記の char moji10[4];★★★★★★★★★★ の部分ですが、これを配列を用いずに、moji10とした場合(応じてsscanfでは&moji10になる)や moji10[2]、moji10[3]とした場合でもオーバーフローが検出されました。 sscanfの行になった時に、moji10[0]には文字が入りますが、 moji10[1]~moji10[3]まで、NULL文字'\0'が入っていました。 何故moji10[4]にしないとオーバーフローが消えないのでしょうか? 尚、Visual C++ 2008です。

  • c言語のscanfとfgetsについて

    2つの単語A, Bを入力して、AがBに含まれるか否かというプログラムで 以下のようなものを作成しました。 そこで質問なのですがscanf()をfgets()に変えるとうまく動作しません どこが間違ってますか? 変更したいfgets fgets(key, sizeof(key), stdin); fgets(word, sizeof(word), stdin); ------------------------------------------------- int main(void) { char key[101], word[101]; scanf("%s", key); scanf("%*c%s", word); if (strstr(word, key) != NULL) { printf("Find %s In %s\n", key, word); } else { printf("Not Find\n"); } return 0; }

  • ファイルの中身をすべて表示

    ファイルの中に二行の文章が入っているのですが、一行目しか表示されません。 二行目も表示するにはどのようにすればいいでしょうか。 int main( void ) { char moji[100]; fgets(moji, 100, stdin); return 0; } でリダイレクションを使ってファイル内の文字を表示させるつもりです。 よろしくお願いします。

  • ソースコードの間違い (C言語)

    変数に、文字列を入れた配列の文字列の最後の要素数を入れたいのですが(つまり'\0')、うまくいきません。いつも2個多い値になってしまいます。 #include <stdio.h> void main() { char moji[100]={0}; int c=0; fgets(moji,sizeof moji,stdin); while( moji[c] != '\0' ) ++c; printf("\n%d\n",c); // } 例えば5文字の1ビット文字を入れると、最後の文字はmoji[4]にあるのでprintfで4と表示されるはずじゃないですか。でも6になるんです。いつも+2の値になるんですよ。どうやらfgetsを使っているからそうなるらしく、scanfを使うと結果は1多い値に、普通に配列に直接文字列を代入すると正常な結果になります。別にcに-2してもいいのですが、それはなんだか癪といいますか・・・。なぜこういうことがおきるのでしょうか?回答よろしくお願いします。

  • gets fgetsについて

    対話式のプログラムを作成したのですが、fgetsのところで勝手に文字が入力されてるような処理になってしまい、こちら側から入力できません。 fgetsのところで通常通り入力できるようにするにはどうしたら良いのでしょうか? コードは以下のとおりです。 #include <stdio.h> #include <string.h> main() { int kazu; char sentaku[1]; char string[10]; printf("文字を入力してください\n"); /*文字入力要求のメッセージ*/ fgets(sentaku,1,stdin); /*確認時にenterを読み込まないようにfgetsで文字取得*/ sscanf(sentaku,"%d",&kazu); putchar(sentaku[1]); /*putcharを使ってmojiを画面出力*/ putchar('\n'); /*改行コードを出力*/ printf("ここから先に進みますか?-Y/N->\n"); fgets(sentaku,1,stdin); /*確認時にenterを読み込まないようにfgetsで対話する*/ sscanf(sentaku,"%d%",&kazu); if(sentaku[0]==121) /*入力した文字がyだった場合*/ { strcpy(string,"spring\n"); /*strcpyを使って変数に代入*/ putchar(string[0]); /*putcharを使って画面出力*/ putchar(string[1]); putchar(string[2]); putchar(string[3]); putchar(string[4]); putchar(string[5]); } }

専門家に質問してみよう