痔になりやすい生活習慣とは?

こんにちわ,
今Cの勉強をしているんですが,入力をして,何も入力しないもしくは20字以上だと再入力させるのプログラムを作りたいんですけどどうしたらよろしいでしょうか。
charsk[21];

start1:
while(stdin = "
puts("入力");
if ((*fgets(sk,sizeof(sk),stdin) < 0x21) || strlen(sk) >= 21 )
{
  puts("error");
  goto start1;
}
だと,20字以上のときにstdinのバッファに残ってしまってエラー表示が2度出ます。
ちなみにfflush(stdin)は使用できないANSI C規格です。
よろしくお願いします。

A 回答 (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 ) );
}
でいかがでしょうか。
    • good
    • 0

start1へ飛ぶ前に残りを全部読んでしまったら?

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC言語 strlen 再入力を促す

文字列の比較で、
文字列の長さが60以上の時、再入力を促します。
while文を使って書いてみたのですが、
文字列Bの入力の前に、もう一度意味もなく
「文字列Aを入力===>」が表示されたり。
文字列Aのほうが小さいのに「Aのほうが大きい」と
表示されるようになったり、変な感じです。
どなたかご指摘・ご指導のほどよろしくお願いします。

int main(void)
{
char moji1[100];
char moji2[100];

while(strlen(moji1)>60){
    printf("文字列Aを入力===>"); scanf("%80s" ,moji1);
}
while(strlen(moji2)>60){
    printf("文字列Bを入力===>"); scanf("%80s" ,moji2);
   }

if(compare(moji1,moji2)>0){
printf("===AはBより大きい===\n");
}
else if(compare(moji1, moji2)<0){
printf("===AはBより小さい===\n");
}
else if(compare(moji1, moji2)==0){
printf("===AとBは等しい===\n");
}
return 0;
}
int compare(char *x, char*y)
{
while(*x==*y && *x!=0){

x++;
y++;
}
return (*x-*y);
}

文字列の比較で、
文字列の長さが60以上の時、再入力を促します。
while文を使って書いてみたのですが、
文字列Bの入力の前に、もう一度意味もなく
「文字列Aを入力===>」が表示されたり。
文字列Aのほうが小さいのに「Aのほうが大きい」と
表示されるようになったり、変な感じです。
どなたかご指摘・ご指導のほどよろしくお願いします。

int main(void)
{
char moji1[100];
char moji2[100];

while(strlen(moji1)>60){
    printf("文字列Aを入力===>"); scanf("%80s" ,moji1);
}
while...続きを読む

Aベストアンサー

こんばんわ

コンパイラの種類によっては、バッファを確保時にゼロクリアしないものもありますので、
バッファを確保した場合は、必ず、バッファをクリアすることをお勧めします。
入力文字列は、80文字以内ですが、入力された文字列の最後のNULLが、
保障されていないため、strlenや、compareで、バッファオーバーランを起こしている可能性があります。

上記問題は、compare内部で、while の前で、printf()で、それぞれの、文字列を表示してみることで、
確認できると思います。

もし、バッファクリアの問題であれば、解決方法としては、単純に、
char moji1[100]={0};
char moji2[100]={0};

でOKだと思います。

また、80文字未満で入力した場合に、最初のenterキーが無視される可能性もあるので、
ご参考までに、scanfの説明のURLをつけておきます

参考URL:http://ja.wikipedia.org/wiki/Scanf

Qjavaで入力を促すメッセージの作成方法

C言語でよく見かける

>test01.exe
数値を入力してください-->100
-10~10の範囲の値を入力してください-->2
答えは4です


(3行目はエラーだったため再入力を促している)

のような、外部からの入力を促すメッセージはJavaではどのようにすれば実現できるのでしょうか・・・。

とても初歩的なことのような気もするのですが・・・。

Javaでよく見るサンプルは最初から引数をとるようにしているものばかりで、
入力を促すプロンプトを表示して、その入力を利用して処理を行うというサンプルは見たことがありませ。。。

ご存知の方がいたらぜひ教えてください。
よろしくお願いします。

Aベストアンサー

概念的には簡単な処理です。

ただ、実際的にいささか複雑なんですよ。

キーボードからの入力は、
System.inで取得できます。
System.outの反対ですね。
ですが、これは、InputStreamなので、
行単位の入力ができません。
「テキスト」で「行入力」をするために、
ストリームをもう2段重ねる必要があります。

InputStreamReader is = new InputStreamReader(System.in);//テキストのストリーム
BufferedReader br = new BufferedReader(is);//行単位で使えるストリーム

これでストリームbrから、
String s = br.readLine();
を使えば入力ができます。
(注意:入力エラーの用心にtryで囲む必要あり)

Stringが得られた後、Integer.parseInt()等で、
希望の型に変換する必要があるかもしれません。

QEnterキーを押されたら次の処理に移るという事をしたい。

コンソールアプリケーション上で文字列を表示させた後、ユーザーがエンターキーを押したら次の文字列を表示するという仕様にしたいのですが、エンターキーだけ入力待ちにするっていうのはどのように書けばいいんでしょうか?

Aベストアンサー

#include <stdio.h>

int main(void)
{
char *str[] = {"abc", "def", "ghi", "jkl"};
int i;

for(i = 0; i < 4; i ++){
while(getchar() != '\n') ;
puts(str[i]);
}
return 0;
}

Q文字列がNULLか空文字列かの判定

Visual C++で、Cのプログラムを作成しているものです。(OS:WinNT 4.0)
文字列の扱いについて、質問します。

関数 int func(char *str) があると仮定します。
パラメータとして、strは以下のような状態あるとします。
(strは関数が呼ばれる前にcalloc()で領域確保済み)
 シンボル名 値
 str      0x00000001 ""
上記の状態で、strがNULLか空文字列("")であることを条件式にしたいのですが、str == NULL は偽となり、strcmp(str, "") を使用すると異常終了します。
どうしたらよいのでしょうか。アドバイスをお願いします。

Aベストアンサー

No1の方の回答にあるように、calloc()で取れた領域のアドレスを正しく渡せてないように思えますが...

#defineERROR(-1)

int func(char *str)
{
  if( (!str) || (!strlen(str)) ) return ERROR;
  return strlen(str);
}

void main()
{
  char *p=(char*)calloc(10,10);
  printf("%d\n",func(p));
}

Q数字以外が入力されたらエラー文を出したい。

scanfで数字を取り込みたいのですが、ここでaなどのアルファベットや記号を入力すると、無限ループが発生してしまいます。
エラーが出ないように、数字以外が入力されたら、エラーメッセージを出すようなプログラムを作りたいのですが、どうすれば出来るでしょうか。

Aベストアンサー

★アドバイス
>scanfで数字を取り込みたいのですが、ここでaなどのアルファベットや記号を入力すると、
>無限ループが発生してしまいます。
 ↑
 ソースとかを見せて欲しいです。
 見ないとなぜ無限ループするのか判断できません。
>エラーが出ないように、数字以外が入力されたら、エラーメッセージを出すようなプログラムを
>作りたいのですが、どうすれば出来るでしょうか。
 ↑
 多分、scanf で整数の入力を行っていると思うので文字列で入力するようにします。
 そしてそのその文字列を strtod() 関数で整数に変換します。
・このときグローバル変数の errno を調べて ERANGE なら整数値のオーバーフローが起きたとか、
 第2引数で私のポインタに変換できなくなった位置をセットしますので、このポインタが \0 文字
 以外なら数字以外(アルファベットや記号)が混ざっていることになります。
・下にそのサンプルを載せます。

サンプル:
char buff[ 256 ];
char *argp;
int value;

// 文字列で入力
scanf( "%s", buff );
value = strtol( buff, &argp, 10 ); ←10進数で変換

// ここでチェック
if ( (errno != ERANGE) && (*argp != '\0') ){
 printf( "変換不可能な文字が入力されています。\n" );
 exit( 1 );
}

その他:
・上記のサンプルを使うには errno.h をインクルードして下さい。
 このヘッダに ERANGE 定数が定義されています。
 あと stdlib.h もインクルードしないと strtol() 関数が利用できません。
・以上。下の『参考URL』もどうぞ。

参考URL:http://www9.plala.or.jp/sgwr-t/lib/strtol.html

★アドバイス
>scanfで数字を取り込みたいのですが、ここでaなどのアルファベットや記号を入力すると、
>無限ループが発生してしまいます。
 ↑
 ソースとかを見せて欲しいです。
 見ないとなぜ無限ループするのか判断できません。
>エラーが出ないように、数字以外が入力されたら、エラーメッセージを出すようなプログラムを
>作りたいのですが、どうすれば出来るでしょうか。
 ↑
 多分、scanf で整数の入力を行っていると思うので文字列で入力するようにします。
 そしてそのその文字列を str...続きを読む

Q一定のスペースを空けて端を揃えて表示

一定のスペースを空けて端を揃えて表示

お世話になります。
一定のスペースを空けて文字を表示したとき、縦に綺麗に揃えて表示したいのですがやり方がわかりません。
例えば、

apple ここに15個分のスペース (2,8) (3,6)
orange ここに15個分のスペース (3,7) (9,8) (2,10)
dog ここに15個分のスペース (3,0)
fortunately ここに15個分のスペース (6,6)

このように、各行の左側には英単語1つ、そして15個分のスペースを空けて、右側にその単語の座標を表示します。
この時に、座標を縦にきれいに揃えて表示したいのですが、英単語の長さによってバラバラになってしまいます。
どのようにスペースをあけて表示すればよいのでしょうか?宜しくお願いします。

Aベストアンサー

5分遅れで同じ回答をしてしまった(^^;
ついでなので、もう少し文字種の範囲を広げても大丈夫なものを作成してみた。

public static void main(String[] args) {
String[] word = {"りんご", "おranじ", "犬", "fortunately"};
String[] coord = {"(2,8) (3,6)", "(3,7) (9,8) (2,10)", "(3,0)", "(6,6)"};
java.nio.charset.Charset charset = java.nio.charset.Charset.forName("Shift_JIS");
int width = word[0].getBytes(charset).length + 15;
for (int i = 0; i < word.length; i++) {
String format = "%-" + (width - word[i].getBytes(charset).length + word[i].length()) + "s%s%n";
System.out.printf(format, word[i], coord[i]);
}
}

前提として、
与えられた文字がシフトJISで表せるようなもので、
シフトJISで1バイトコードになるものがいわゆる半角(1桁幅)、
2バイトコードになるものがいわゆる全角(2桁幅)となるのなら、
上のようにすることで対処できる。

要点は文字数でなく文字を構成するコードが何バイトかを数えて、
2バイトなら2桁分のスペースを用意する。
これには、getBytesでStringからバイト配列を得てlengthでバイト数を得る。

今度は書式文字列は各行ごとに変わる可能性がある。
widthはword[0]の文字列幅に15スペース分を加えたもの。
"apple"でなく"りんご"なので21になる。
つまり座標の表示は22桁目からということになる。

各行の書式文字列での、
(width - word[i].getBytes(charset).length + word[i].length())
で、バイト数と文字数との差を求めて表示幅から引くことで、
1文字が2桁になる場合に対処している。

書式は使いどころによって便利なもので、
printfで書式出力するところを、
StringクラスのformatメソッドでStringインスタンスにすることもできたりする。

5分遅れで同じ回答をしてしまった(^^;
ついでなので、もう少し文字種の範囲を広げても大丈夫なものを作成してみた。

public static void main(String[] args) {
String[] word = {"りんご", "おranじ", "犬", "fortunately"};
String[] coord = {"(2,8) (3,6)", "(3,7) (9,8) (2,10)", "(3,0)", "(6,6)"};
java.nio.charset.Charset charset = java.nio.charset.Charset.forName("Shift_JIS");
int width = word[0].getBytes(charset).length + 15;
for (int i = 0; i < word.length; i++) {
String format = "%-...続きを読む

Qバッファとは何ですか

C言語を使用してるとバッファという言葉がよく出てきますがバッファとは何ですか
メモリとは違うものですか
訳をみても緩衝材とか一時的に蓄える場所という意味でよく分かりません
一時的でない使い方も多い気がしますが実際はどういうものですか

Aベストアンサー

#1です

寝ぼけて適当に書いたので修正。

すぐ見つけることができたもので正確なものは英語版ですがこちらくらいかも。
Data buffer - Wikipedia (en.)
http://en.wikipedia.org/wiki/Data_buffer

一応簡単なものはこちらです。
バッファとは - e-Wrods
http://e-words.jp/w/E38390E38383E38395E382A1.html

「複数の機器やソフトウェアの間でデータをやり取りするときに、処理速度や転送速度の差を補うためにデータを一時的に保存しておく記憶装置や記憶領域のこと。」
が現在の基本定義です。処理速度・転送速度の差のための緩衝材的な意味です。

昔はソフトウェアとハードウェア間に使うデータでソフトウェア側がデータを受け取るか、整形して送信するときに使うメモリ領域が基本的にバッファでした。
マルチプロセッサ・マルチタスクの時代になってくると、ソフトウェア間の処理速度の違いを吸収するために使うメモリ領域にもバッファという言葉が使われるようになりました。ソフトウェア間で逐次(FIFO)処理されるデータのためのメモリ領域がこちらの使われ方の主戦場といったところでしょうか。

ソフトウェア間でただ一括転送されるデータならバッファという言葉は誤用ということになるのですが、よく誤用されます。

#1です

寝ぼけて適当に書いたので修正。

すぐ見つけることができたもので正確なものは英語版ですがこちらくらいかも。
Data buffer - Wikipedia (en.)
http://en.wikipedia.org/wiki/Data_buffer

一応簡単なものはこちらです。
バッファとは - e-Wrods
http://e-words.jp/w/E38390E38383E38395E382A1.html

「複数の機器やソフトウェアの間でデータをやり取りするときに、処理速度や転送速度の差を補うためにデータを一時的に保存しておく記憶装置や記憶領域のこと。」
が現在の基本定義です。処理速度・転送速...続きを読む

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

こんにちは,今C(C++でない)を使用しています。
たとえば,
char str[20]
fgets(str,sizeof(str),stdin)
としたときに20字以上を打つと,stdinのバッファに20字以上の分が残ったままになります。

C++などでは
fflush(stdin)で,うまくいきますが,普通のCでは対応がされていないみたいでうまくいきません。

よろしくお願いします。

Aベストアンサー

あ,テキスト入力だからこんな大掛かりなことしなくてもいいんだ.
末尾に'\n'が出るまで掃出せばいいんですよね.

fgets(str, sizeof(str), stdin);
if ( str[strlen(str)-1] != '\n' ){
while( getchar() != '\n' );
}

でいいんだ.失礼しました.

Q画面出力の際の繰り返しと入力文字チェック

いつもお世話になっております。
System.out.println("数字を入力してください");
InputStreamReader reader = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(reader);
String str = br.readLine();
int res = Integer.parseInt(str);
と記述して画面に出力させた場合、数字以外を入力するとエラーになりますが、入力文字のチェックが可能な方法をご存知の方お願いします。
もうひとつ、作業が終わった後も"数字を入力してください"と繰り返すプログラムについてもご教授ください。
いつも簡単な質問で申し訳ありません・・。一応逆引き辞典で調べてはいるのですが。。

Aベストアンサー

>入力文字のチェック
try {
int res = Integer.parseInt(str);
}
catch(NumberFormatException e){
System.out.println("整数として解釈できない文字が入力されました");
}
のような感じで例外処理します。

>繰り返すプログラム
全体を
while(true){

}
で囲むと繰り返すプログラムになります。
trueの部分を条件式にして条件でループを終了するようにしておくか
if(条件)
break;
のようにループを条件で脱出できるようにしておきます。

Qファイル出力の場所を指定

現在C++にてhtmlファイルを出力するプログラムを作っているのですが、出力場所を指定することはできるのでしょうか?(現在はそのプログラムソースが保存されている場所と同じファイル内に出力されますが、それをデスクトップに出力するなど。)
もし、方法がありましたら、教えてください。
ソースや参考HPのURLなどのせていただけたらありがたいです。
環境はVisualStudio.NET2003です。
よろしくお願いします。

Aベストアンサー

単にファイル名の前にパスを指定する。

絶対パス指定
fp=fopen("c:/temp/test.txt","w");

相対パス指定
fp=fopen("./hoge/test.txt","w");


デスクトップはOSやユーザによって場所が異なるので、少し面倒です。
XPの場合環境変数を利用してこんな感じで出来ると思います。

例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(void)
{
FILE *fp;
char fname[1024];
strcpy(fname,getenv("USERPROFILE"));
strcat(fname,"/デスクトップ/test.txt");
fp=fopen(fname,"w");
//処理
fclose(fp);
}


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング