Используя scanf для чтения определенного количества символов в C? - PullRequest
1 голос
/ 10 декабря 2010

У меня проблемы с приемом ввода из текстового файла. Моя программа должна читать строку, указанную пользователем, и длина этой строки определяется во время выполнения. Он отлично работает, когда пользователь запускает программу (ввод значений вручную), но когда я запускаю текстовый файл моего учителя, он запускается в бесконечный цикл.

Для этого примера, это терпит неудачу, когда я беру 4 символа, и его ввод в его файле "ABCDy". «ABCD» - это то, что я должен читать, а «y» должен использоваться позже, чтобы знать, что я должен перезапустить игру. Вместо этого, когда я использовал scanf для чтения в «ABCD», он также читается в «y». Есть ли способ обойти это, используя scanf, предполагая, что я не буду знать, какой длины должна быть строка до времени выполнения?

Ответы [ 4 ]

15 голосов
/ 10 декабря 2010

Обычно вы используете что-то вроде "%4c" или "%4s" для чтения максимум 4 символов (разница в том, что "%4c" читает следующие 4 символа независимо, в то время как "%4s" пропускает начальный пробел и останавливается на пробел, если он есть).

Однако, чтобы указать длину во время выполнения, вы должны стать немного хитрее, поскольку вы не можете использовать строковый литерал с «4», встроенным в него. Одна альтернатива - использовать sprintf для создания строки, которую вы передадите scanf:

char buffer[128];

sprintf(buffer, "%%%dc", max_length);
scanf(buffer, your_string);

Возможно, мне следует добавить: с помощью printf вы можете динамически указать ширину или точность поля, поставив звездочку (*) в строке формата и передав переменную в соответствующую позицию, чтобы указать ширину / точность:

int width = 10;
int precision = 7;
double value = 12.345678910;

printf("%*.*f", width, precision, value);

Учитывая, что строки формата printf и scanf очень похожи, можно подумать, что то же самое будет работать с scanf. К сожалению, это не так - с scanf звездочка в спецификации преобразования указывает значение, которое должно быть отсканировано, но не преобразовано. То есть что-то, что должно присутствовать во входных данных, но его значение не будет помещено ни в одну переменную.

0 голосов
/ 11 декабря 2010

Вы также можете использовать fread, где вы можете установить предел чтения:

char string[5]={0};
if( fread(string,(sizeof string)-1,1,stdin) )
  printf("\nfull readed: %s",string);
else
  puts("error");
0 голосов
/ 10 декабря 2010

Вы можете рассмотреть возможность циклического вызова getc () .

0 голосов
/ 10 декабря 2010

Попробуйте

scanf("%4s", str)
...