Вопрос
Как Промойте stdin.??
Почему он не работает в следующем фрагменте кода?
#include <string.h>
#include <stdio.h>
#include <malloc.h>
#include <fcntl.h>
int main()
{
int i=0,j=0, sat;
char arg[256];
char * argq;
argq = malloc(sizeof(char)*10);
printf("Input the line\n");
i=read(0, arg, sizeof(char)*9);
arg[i-1]='\0';
fflush(stdin);
i=read(0, argq, sizeof(char)*5);
argq[i-1]='\0';
puts(arg);
puts(argq);
return 0;
}
Теперь, если я даю вклад как 11 символов, только 9 следует читать, но оставшиеся два символа в STDIN не промыты и снова в argq. Почему?
Вход: 123 456 789
Выход: 123 456 89
Почему я получаю это 89 как вывод?
Решение
Я считаю, что Fflush используется только с выходными потоками.
Вы можете попробовать ловкость или __Зпурга на Linux. Обратите внимание, что Fpurge нестандартно, а не портативный. Это может быть не доступно для вас.
Из Страница человека Linux Fpurge: Обычно это ошибка, чтобы выбрать входные буферы.
Наиболее переносное решение для промывки Stdin, вероятно, было бы чем-то вдоль линий следующего:
int c;
while ((c = getchar()) != '\n' && c != EOF);
Другие советы
int c;
while((c = getchar()) != '\n' && c != EOF);
Как я очистил входной буфер.
Как промыть stdin ??
Промывочные входные потоки вызывают неопределенное поведение. Не пытайтесь это.
Вы можете промывать только выходные потоки.
Вы переопределяете последний элемент ввода в arg
с участием '\0'
. Отказ Эта линия должна быть arg[i]='\0';
вместо этого (после ошибки и границы проверки вас отсутствуют.)
Другие уже прокомментировали промывочную часть.
Вы не можете чистить stdin в Linux, не ударив в сценарии, что команда начнет ждать ввода в некоторых случаях. Способ решения этого - заменить все STD :: CIN с ReadLineTostdString ():
void readLine(char* input , int nMaxLenIncludingTerminatingNull )
{
fgets(input, nMaxLenIncludingTerminatingNull , stdin);
int nLen = strlen(input);
if ( input[nLen-1] == '\n' )
input[nLen-1] = '\0';
}
std::string readLineToStdString(int nMaxLenIncludingTerminatingNull)
{
if ( nMaxLenIncludingTerminatingNull <= 0 )
return "";
char* input = new char[nMaxLenIncludingTerminatingNull];
readLine(input , nMaxLenIncludingTerminatingNull );
string sResult = input;
delete[] input;
input = NULL;
return sResult;
}
Это также позволит вам войти в пробелы в Std :: Cin String.
В Windows вы можете использовать Перемотка (stdin) Фукция.