Почему scanf пропускает '\n' в функции freopen?

Я использую функцию freopen для чтения файлов. Но когда я использую оператор scanf для сканирования целых чисел, он пропускает символ '\n'. Как я могу не пропустить '\n' от scanf.

3 ответа

Решение

Вы не можете! Но не волнуйтесь, есть обходные пути.

Временное решение:

Читайте ввод по одной строке за раз (используя fgets), а затем используйте sscanf сканировать на целые числа.

#define LINE_MAX 1000
line[LINE_MAX];
int num;

while (fgets(line, LINE_MAX, fp) != NULL) {
    if (sscanf(line, "%d", &num) == 1) {
        // Integer scanned successfully
    }
}

Рекомендую опубликовать больше ваших целей кодирования, чтобы мы могли предложить, как избежать необходимости "не пропускать \ n".

scanf() не пропускает '\n', Выберите формат определяет как "%d" непосредственный scanf() пропустить ведущий белый темп - в том числе '\n',

Если кто-то хочет использовать scanf() и не пропустить '\n', используйте спецификаторы формата как "%[]" или же "%c", В качестве альтернативы, попробуйте новый подход с fgets() или же fgetc(),

Если код должен использовать scanf() и не пропустить ведущий '\n' при сканировании int, предложить следующее:

char buf[100];
int cnt = scanf("%99[-+0123456789 ]", buf);
if (cnt != 1) Handle_UnexpectedInput(cnt);

// scanf the buffer using sscanf() or strtol()
int number;
char sentinel
cnt = sscanf(buf, "%d%c", &number, &sentinel);
if (cnt != 1) Handle_UnexpectedInput(cnt);

Альтернатива: сначала использовать все ведущие пробелы в поисках \n,

int ch;
while ((ch = fgetc(stdin)) != '\n' && isspace(ch));
ungetc(ch, stdin);
if (ch == '\n') Handle_EOLchar();
int number;
int cnt = scanf("%d", &number);
if (cnt != 1) Handle_FormatError(cnt); 

xscanf функции будут обрабатывать строки с помощью DFA. Будет выполнен поиск в формате, заданном аргументом fmt, каждый пробел (пробел,\t,\n,\r и т. Д.) Будет пропущен. Вы можете вставить эти символы в fmt для сопоставления.

Например, как это делает пропуск:

#include <stdio.h>
#include <stdlib.h>


int main(int argc, char** argv)
{
    char* s = "1 2 \n 3 4 \n 5 \n \n \n 6";
    int i,c;
    int tot=0;
    while(sscanf(s+tot,"%d%n",&i,&c)){
        printf("'%s':%d,cnt=%d\n",s+tot,i,c);
        tot += c;
    }
    return 0;
}
/*** Output:
'1 2 
 3 4 
 5 


 6':1,cnt=1
' 2 
 3 4 
 5 


 6':2,cnt=2
' 
 3 4 
 5 


 6':3,cnt=4
' 4 
 5 


 6':4,cnt=2
' 
 5 


 6':5,cnt=4
' 


 6':6,cnt=8
'':6,cnt=8
***/
Другие вопросы по тегам