BLUEPIXYは間違いありません。 scanf()
からの最初の復帰は、\n
を入力バッファに残しています。その後scanf()
コールは、\n
での読み取りを中止するので、stdin
からの文字を読み取らずにすぐに戻ります。scanf()
ループが続いています。あなたが入力がどのように機能するかについて、いくつかの偽の信念の下にあるように見える
#include <stdio.h>
int main()
{
char str[100] = {0};
do
{
scanf("%[^\n]",str);
getchar();
printf("%s\n",str);
}while(str[0] != '\0');
}
:以下に示すようにループを回避する1つの方法は、scanf()
への呼び出し後の入力から\n
を読むことです。だから私は以下で説明するつもりです。
scanf()
は、文字列形式を指定するときに一度に1文字を読み込んで返さないため、ループ内でこれを行う必要はありません。入力はbuffered
です。 scanf()
に文字列を返すように依頼すると、端末はnewline
を受け取ったときに入力文字列をscanf()
にのみ送信します。それが起こると、のない文字列が返されます。
端末回線のバッファリングをオフにするには、余分な作業が必要になります。以下のコード例は、ターミナルI/Oバッファリングをオフにする方法を示しています。
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
int main()
{
struct termios old_tio, new_tio;
unsigned char c;
/* get the terminal settings for stdin */
tcgetattr(STDIN_FILENO,&old_tio);
/* we want to keep the old setting to restore them a the end */
new_tio=old_tio;
/* disable canonical mode (buffered i/o) and local echo */
new_tio.c_lflag &=(~ICANON & ~ECHO);
/* set the new settings immediately */
tcsetattr(STDIN_FILENO,TCSANOW,&new_tio);
do {
c=getchar();
printf("%c ",(char)c);
} while(c!='q');
/* restore the former settings */
tcsetattr(STDIN_FILENO,TCSANOW,&old_tio);
return 0;
}
'str [0]'を初めてテストすると、初期化されません。 'scanf'は値を返します。これを使って。 –
'scanf("%[^ \ n] "、文字列);' 1回目の改行が残っています。 2回目以降、拒否されます。 'str [0]!= '\ 0''も最初に、初期化変数を使用しています。 – BLUEPIXY
"gets()関数を認識していますが、これは廃止されているので使用しないでください。 –