Как ограничить scanf при чтении ввода из файла - PullRequest
1 голос
/ 03 июля 2019

Я новичок в C, и я написал программу вроде:

#include<stdio.h>

int main() {

    char r[10];
    char y[10];
    puts("Printing Data \n");
    while (scanf(" %10s %s",r,y) == 2) {
        printf("%s and %s\n",r,y);
}
    return 0;
}

CMD ./prog.c

file.txt

aman dhaker
rudra pratap hensome
nitesh dhakar

Хотя я хотел, чтобы scanf считывал только 2 строки, но имел 3 строки в строке 2 файла file.txt, я хотел пропустить 3-й аргумент, который был ужасен, так как я хочу напечатать только 2 строки, но почему-то не могу пропустить конкретную строку строка.

Мой текущий вывод:

aman dhaker
rudra pratap hensome
nitesh dhakar

Мой желаемый вывод:

aman dhaker
rudra pratap
nitesh dhakar

Пожалуйста, помогите мне.

Я пытался включить регулярное выражение типа [^], чтобы исключить результат, включая пробелы, но не получилось.

Ответы [ 2 ]

5 голосов
/ 03 июля 2019

Вы можете прочитать каждую строку с помощью fgets, а затем применить sscanf к прочитанной строке, например,

#include <stdio.h>

int main(void) {

    char r[10];
    char y[10];
    char input[100];
    while(fgets(input, sizeof input, stdin) != NULL) {
        if(sscanf(input, "%9s%9s", r, y) == 2) {
            printf("%s %s\n", r, y);
        }
    }
    return 0;
}

Вывод программы:

aman dhaker
rudra pratap
nitesh dhakar

Обратите внимание, что я ограничил длину строки до 9, чтобы использовать терминатор NUL.

Использование fgets тогда sscanf часто лучше, чем использование scanf. Это значительно упрощает управление потоком и избавляет от необходимости очищать буфер ввода - если был неправильный ввод, вы можете просто забыть строку и ввести другой.

3 голосов
/ 03 июля 2019

Даже если вы указываете, что в вызове scanf требуется только 2 строки, другая строка остается в буфере, когда вы передаете 3 строки, вам необходимо очистить / использовать ее:

while (scanf("%9s %9s", r, y) == 2) { // No need to use a space before first %10s
    int c;                            // and you need space for the NUL terminator
    while ((c = fgetc(stdin)) != '\n' && c != EOF);
    printf("%s and %s\n", r, y);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...