• 締切済み

入力されたとき,何も入力しない,もしくは20字以上だと再入力のプログラム??

arukamunの回答

  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.2

#include <stdio.h> main() {   char sk[21] ;   int i ;   i = -1 ;   puts("入力");   do {     i ++ ;     if ( i > 21 ){       puts("\nerror\n入力");       i = 0 ;     }     sk[i] = getch();     printf("%c",sk[i]);   } while ( sk[i] != 0x0D ); } これだと21文字目を入れた時点でerrorを表示します。 ENTERを押した時点でerrorを表示して再入力させるのであれば、 #include <stdio.h> main() {   char sk[21],c ;   int i ;   i = -1 ;   puts("入力");   do {     i ++ ;     if ( i < 21 ){       c = sk[i] = getch();     } else if ( c == 0x0D ){       puts("\nerror\n入力");       i = 0 ;       c = sk[0] = getch();     } else {       c = getch();     }     printf("%c",c);   } while ( !( c == 0x0D && i < 21 ) ); } でいかがでしょうか。

関連するQ&A

  • fgetsなどのときのstdinのバッファを消すには?

    こんにちは,今C(C++でない)を使用しています。 たとえば, char str[20] fgets(str,sizeof(str),stdin) としたときに20字以上を打つと,stdinのバッファに20字以上の分が残ったままになります。 C++などでは fflush(stdin)で,うまくいきますが,普通のCでは対応がされていないみたいでうまくいきません。 よろしくお願いします。

  • strlen

    c言語初心者です。 10文字以上入力すると警告してくれるプログラムを考えています。 一応文字数を制限するにあたりstrlenを使おうとしてるのですが 思ったように機能してくれません。 以下が私の書いたプログラムです。 void main() { char name[10]={0}; memset( name, '\0', sizeof(name) ); loop: puts("*****登録*****"); printf(" 名前 :"); fgets(name,10,stdin); //バッファクリア**// if(strchr(name,'\n') == NULL) { while(getchar() != '\n'); } if(strlen(name)>10) { puts("<<文字入力数が多すぎです>>"); fgets(name,10,stdin); //バッファクリア**// if(strchr(name,'\n') == NULL) { while(getchar() != '\n'); } system("cls"); goto loop; } else { puts("OK"); } } よろしくお願いします。

  • goto文が思うようにいかない

    goto文をつくプログラムを組んだのですが、動作が思うようになりません。 《ソースコード》 #include <stdio.h> void main() { int c; char shin2[50]; start: printf("文字を入力してください"); fgets(shin2, sizeof(shin2), stdin); printf("続けるなら0,終わるならそれ以外を入力"); scanf("%d",&c); if(c==0)goto start; } 説明のため省略した部分があるので意味のないソースコードになっています。 最後のscanfで0を入力して、goto文でラベルstartに移ったあとのfgetsが、値を入力する前に次に移ってしまいます。これはなぜでしょうか?回答よろしくお願いします。

  • c言語で質問なのですが

    c言語で質問なのですが 下に私の疑問点があるプログラムの一部を書き込みます。 printf("ふりがな:"); memset(p[i].huri, 0, sizeof(p[i].huri)); fgets(p[i].huri,sizeof(p[i].huri),stdin); if(strchr(p[i].huri,'\n')==NULL)//バッファ処理 { while(getchar() != '\n'); } if(p[i].huri[strlen(p[i].huri)-1]=='\n')//改行解除 { p[i].huri[strlen(p[i].huri)-1] = '\0'; } if(strlen(p[i].huri)>25) { puts("<<文字入力数が多すぎでしょうあんた>>"); puts("何かキーを押してください"); getchar(); system("cls"); continue; } ここで私は構造体配列にふりがなを登録します。 しかし25文字以上なら登録できないようにしたいのですが。 if文で制御しよう試みているのですがうまくいきません。 この場合fgetsを使った時点で格納されているのでしょうか? 結局25文字以上でも構造体配列に格納されてしまいます。 どなたか教えていただけませんでしょうか? よろしくおねがいします。

  • プロンプト入力 malloc( )

    #include <iostream.h> void f(char* str); main(){ char s[8] = "\0"; cout << "文字を入力" << '\n'; fgets(s, 8, stdin); f(s); } void f(char* str){ char* c; c = (char*)malloc(sizeof(char) * strlen(str)+1); cout << strlen(str) << '\n'; cout << sizeof(c); free(c); } - 結果 - 文字を入力 ( a、Ctrl+Z ) a 1 4 でした。 cout << sizeof(c); の結果は4でした。1バイトの入力だから\0を含めて 2バイトを確保したかった。 そのためにはどうしたらいいんですか? どうして4だったんですか? 文字を入力するとこで、Ctrl+Z の代わりに Enter を押すと Enter まで s に格納されてしまう。 cin を使うと8バイト以上の入力でも s に格納されてしまう。 そうならないためのよい方法があったら教えてください。

  • fgetsとsscanf

    C言語の勉強をしております。 初歩的な質問なのかもしれないですが、 char buf[80]; char data[32]; fgets(buf,sizeof(buf),stdin); sscanf(data, "%s", buf); と、 fgets(data, sizeof(buf), stdin); は何が違うのでしょう? 他の質問内容やネットで探してみたんですが、基本的には組み合わせて使用されているみたいなんですが、必要性がわかりません・・・。 例えば、fgetsで構造体のメンバ(文字配列)へキーボードからデータを入力したい場合は、どちらで行うのが良いのでしょう? また、入力データが未入力かどうか判断させるには、 fgets(buf,sizeof(buf),stdin); if(buffer[0] == '\n'){   /* ループを抜ける */   break; } で良いですよね? ※関連している質問 http://oshiete1.goo.ne.jp/qa4438371.html あと、同じ処理内で、getsやscanfを混同して使用すると、どこかの入力時に改行がバッファに残ってしまい、入力処理が飛ばされてしまいますか? 以上、よろしくお願いいたします。

  • fflush()、setbuf()について

    C言語にお詳しい方、ご回答お願いします。 fflush関数は、「バッファに格納されているデータを吐き出す。」とあるのですが、具体的にどのような動作をするのでしょうか? (1)fflush(stdin),fflush(stdout)とそれぞれ記述するとどのような動作をするのか。 (2)データをフラッシュしたいときとは、具体的にどんなときか。(scanfなどで続けてデータの入力を行うこと以外に) setbuf関数は、「出力バッファをユーザバッファに指定」とあるのですが、具体的にどういう意味なのでしょうか? (1)setbuf(stdout,buf)、setbuf(stdin,buf)とそれぞれ記述するとどのような動作をするのか。 よろしくお願いします。

  • プログラムの中身の意味

    C言語で縦書き表示のプログラムを習ったんですが、プログラム中でわからない個所がありました。まずは、プログラムです #include<stdio.h> void put_haiku(char *nyuuryoku); int main() { char haiku[100]; puts("俳句を入力せよ"); fgets(haiku,sizeof(haiku),stdin); if(haiku[strlen(haiku)-1] == '\n'){ haiku[strlen(haiku)-1] = '\0'; } put_haiku(haiku); return 0; } void put_haiku(char *nyuuryoku) { char *ptr = nyuuryoku; while(*ptr !='\0'){ printf("%c%c\n",ptr[0],ptr[1]); ptr += 2; } return ; } メイン関数内の put_haiku(haiku); はどのような役割をしているのでしょうか? もうひとつ ユーザー定義関数の char *ptr = nyuuryoku; はポインタを宣言し、さらに初期値にnyuuryokuを代入しているということであっていますか? 簡単な質問ですいません

  • 入力制御

    c言語初心者です。 以下のプログラムをみてください。 #include<stdio.h> int main() { char ch[3]; fgets( ch, 3,stdin );   if(ch[0]=='3') { printf("Hello!\n"); } else if(ch[0]=='2') { puts("回る"); } else{ puts("間違いf"); } return 0; } このプログラムでは2を入力すると"回る"と表示されますが 2wでも同じように表示されてしまいます。 制限して2wで入力したら"間違い"と表示させたいのですがなかなかうまくいきません。 どなたか教えてください。

  • fflushと入力モードのストリーム

    C言語の質問です。 fflushはstdinに対して行ってはいけない(最近のコンパイラはstdinはOKしているみたいですが)と聞きますが、入力モード("r"とか)のストリームに対して行ってはいけませんか? 回答よろしくお願いします。