- 締切済み
入力されたとき,何も入力しない,もしくは20字以上だと再入力のプログラム??
arukamunの回答
- arukamun
- ベストアンサー率35% (842/2394)
#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では対応がされていないみたいでうまくいきません。 よろしくお願いします。
- ベストアンサー
- C・C++・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"); } } よろしくお願いします。
- 締切済み
- C・C++・C#
- 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++・C#
- 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文字以上でも構造体配列に格納されてしまいます。 どなたか教えていただけませんでしょうか? よろしくおねがいします。
- ベストアンサー
- C・C++・C#
- プロンプト入力 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 に格納されてしまう。 そうならないためのよい方法があったら教えてください。
- ベストアンサー
- C・C++・C#
- 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を混同して使用すると、どこかの入力時に改行がバッファに残ってしまい、入力処理が飛ばされてしまいますか? 以上、よろしくお願いいたします。
- ベストアンサー
- C・C++・C#
- fflush()、setbuf()について
C言語にお詳しい方、ご回答お願いします。 fflush関数は、「バッファに格納されているデータを吐き出す。」とあるのですが、具体的にどのような動作をするのでしょうか? (1)fflush(stdin),fflush(stdout)とそれぞれ記述するとどのような動作をするのか。 (2)データをフラッシュしたいときとは、具体的にどんなときか。(scanfなどで続けてデータの入力を行うこと以外に) setbuf関数は、「出力バッファをユーザバッファに指定」とあるのですが、具体的にどういう意味なのでしょうか? (1)setbuf(stdout,buf)、setbuf(stdin,buf)とそれぞれ記述するとどのような動作をするのか。 よろしくお願いします。
- ベストアンサー
- C・C++・C#
- プログラムの中身の意味
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・C++・C#
- 入力制御
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で入力したら"間違い"と表示させたいのですがなかなかうまくいきません。 どなたか教えてください。
- ベストアンサー
- C・C++・C#
- fflushと入力モードのストリーム
C言語の質問です。 fflushはstdinに対して行ってはいけない(最近のコンパイラはstdinはOKしているみたいですが)と聞きますが、入力モード("r"とか)のストリームに対して行ってはいけませんか? 回答よろしくお願いします。
- ベストアンサー
- C・C++・C#