
No.4ベストアンサー
- 回答日時:
あ,テキスト入力だからこんな大掛かりなことしなくてもいいんだ.
末尾に'\n'が出るまで掃出せばいいんですよね.
fgets(str, sizeof(str), stdin);
if ( str[strlen(str)-1] != '\n' ){
while( getchar() != '\n' );
}
でいいんだ.失礼しました.
この回答への補足
ありがとうございます。かなりのヒントになりました。
お礼のついでに完成したのを載せておきます。
#include <stdio.h>
#include <string.h>
int main()
{
char str[20];
intchk_digit;
while(1)
{
chk_digit=0;
puts("入力");
fgets(str, sizeof(str), stdin);if ( str[strlen(str)-1] != '\n' )
{
while( getchar() != '\n' );
chk_digit=1;
}
if (chk_digit == 1 || str[0] == '\n' )
{
break;
}
}
printf("出力:%s\n",str);
return 0;
}
No.3
- 回答日時:
システムは何ですか?fseek(stdin, 0, SEEK_END, 0)はLinuxでは効かないという話を読んだことがあります.SEEK_ENDをEOFと考えれば当然ですが.fseekでいけるシステムではSEEK_ENDを現状でのバッファエンドと捉えているんでしょうか.
で,おおがかりになってきますが,pollまたはselectを使って全部掃出すのはどうでしょう?
#include <stdio.h>
#include <sys/poll.h>
int
main(int argc, char **argv)
{
char s[11], ss[11];
struct pollfd fdlst = {0, POLLIN, 0};
int l;
l = read(0, s, 10); /* sに文字列読込み*/
s[l] = 0;
/* 掃出し */
do {
fdlst.revents = 0;
poll( &fdlst, 1, 1 );
} while ( (fdlst.revents&POLLIN) != 0 && read(0,s,10) > 0 );
/* ssに文字列読込み*/
l = read(0, ss, 10);
ss[l] = 0;
printf("%s", ss);
}
こうするとうちでは,sに何文字打とうと,それ以降に打った文字がssに入りました.ただし,pollはファイルポインタ(stdin)ではなくファイルディスクリプタ(0 = stdin)を使うので,読込みもそれに合わせてreadなどのシステムコールでやる必要があるようです.
#しかし私はfflush(stdin)に驚きでした.それでいけるシステムもあるんですね.
参考URL:http://www.linux.or.jp/JM/html/LDP_man-pages/man …
早速のお答えありがとうございます。
ただ,これを私のPCでコンパイルしようとすると,
(#include <unistd.h>を加えて・・)
[XXXXXXXX]$ gcc -g -Wall -o test test.c
[XXXXXXXX]$ ./test
abcdefghijk (←1回目に打った内容)
abcdefghijk (←2回目に打った内容)
abcdefghij[XXXXXXXXX]$ k
-bash: k: command not found
[XXXXXXXX]$
となり,1回目の入力は11文字以上がうけつけなく,サイドの入力の際は10文字だけが出力され後の一文字(k)がこのプログラムが終了したシステムのコマンドとして認識されるようになりました。
どうしたらいいでしょうか。
No.1
- 回答日時:
fflushはCの標準関数のはずです。
上手く行かないのには別の原因があるのではないでしょうか?
いや,ANSI C規格では、
「fflush関数は出力ストリーム(stdoutとかstderr)にしか使えないように定義されている」
参照:http://www.peke.jp/archive/fmc/article/dev/dev00 …
らしいんですよ。ですから,
fflush(stdout)
はできても,
fflush(stdin)
はできないみたいなんです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
fgets関数を使用したときの文字あふれについて
C言語・C++・C#
-
バッファとは何ですか
C言語・C++・C#
-
Enterキーを押されたら次の処理に移るという事をしたい。
C言語・C++・C#
-
-
4
数字以外が入力されたらエラー文を出したい。
C言語・C++・C#
-
5
C言語での引数の省略方法
C言語・C++・C#
-
6
C言語で今まで表示していた画面の消すには?
C言語・C++・C#
-
7
関数から配列を返すには?
C言語・C++・C#
-
8
fgetsで拾われる改行文字を削除したい
C言語・C++・C#
-
9
scanf関数 バッファに残ったエンター入力の扱い
C言語・C++・C#
-
10
c言語のポインタへの文字列入力についてです。
C言語・C++・C#
-
11
fgets()の仕組みについてくわしくおしえてください
C言語・C++・C#
-
12
間接参照のレベルが異なっています
C言語・C++・C#
-
13
scanf(%s", buf);でスペースを含んだ文字"
C言語・C++・C#
-
14
fgets関数のEOFの扱い方について
C言語・C++・C#
-
15
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
16
C言語におけるfgetsを用いたループ処理について
C言語・C++・C#
-
17
文字列から空白を取り除きたいのですが
C言語・C++・C#
-
18
配列の要素数に変数を入れたいときには
C言語・C++・C#
-
19
ファイル書込みで一行もしくは部分的に上書きする
PHP
-
20
プログラムについての質問です。 fflush(stdout)はいったいどのような時に使われているので
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
charからLPTSTRへの変換方法
-
recvfrom関数の戻り値がおかし...
-
atoi( ) の反対をやりたい
-
fgetsなどのときのstdinのバッ...
-
C言語のfor文です。 繰り返しの...
-
charでの計算?
-
char型からのバイト数取得
-
プログラム
-
文字列から空白を取り除きたい...
-
c言語でユーザ関数を利用して入...
-
PING JPEGファイルのExif規格の...
-
<>で囲まれた文字列を文字列の...
-
配列をnビットシフトする
-
'const char *' 型は 'char *' ...
-
strlen関数と同じ働きをする関...
-
c++ 文字列を入力して、一文字...
-
「Aに対するBの割合」と「Aに対...
-
Aの値からBの値を除するとは??
-
2÷3などの余りについて
-
有効数字について 以前質問をし...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構造体の各メンバにfor文からア...
-
fgetsなどのときのstdinのバッ...
-
文字列から空白を取り除きたい...
-
C言語のfor文です。 繰り返しの...
-
CStringをwchar_tに変換したい
-
間接参照のレベルが異なっています
-
c++ 文字列を入力して、一文字...
-
C言語の入力した文字を反転させ...
-
charからLPTSTRへの変換方法
-
ネットワークにつながっている...
-
'const char *' 型は 'char *' ...
-
テキストデータをそのままバイ...
-
c言語でユーザ関数を利用して入...
-
atoi( ) の反対をやりたい
-
間接操作のレベルとは
-
-'0'の意味について
-
double型の値をchar配列に変換...
-
Linuxでフォルダ内全ファイル名...
-
配列をnビットシフトする
-
型変換
おすすめ情報