从文件中读取输入时如何限制scanf

时间:2019-07-03 08:08:14

标签: c

我是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个字符串,但在file.txt的第2行上有3个字符串,但我想跳过第三个arg,这很麻烦,因为我只希望打印2个字符串,但是以某种方式我无法跳过特定字符串字符串。

我当前的输出:

aman dhaker
rudra pratap hensome
nitesh dhakar

我想要的输出:

aman dhaker
rudra pratap
nitesh dhakar

请帮帮我。

我尝试包括[^]之类的正则表达式以排除包含空格的结果,但是没有解决问题。

2 个答案:

答案 0 :(得分:5)

您可以使用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更好。它使流控制更加容易,并且避免了必须清除输入缓冲区的情况-如果输入不正确,您就可以忘记该字符串并输入另一个。

答案 1 :(得分:3)

即使您在const pool = require('./sql'); const _ = require('lodash'); Foo.readOne = function (foo, callback) { pool.query("SELECT * FROM table_name WHERE oneKey = ?", foo.oneKey, callback); }; Foo.updateOne = function (foo, callback) { Foo.readOne(foo, function (err, data) { if (err) return callback(err); if (_.isEmpty(data)) return callback(new Error(`oneKey ${foo.oneKey} does not exist in the database!`)) _.forEach(Object.keys(foo), key => { if (typeof foo[key] === 'undefined') foo[key] = data[0][key]; }) }); pool.query("UPDATE table_name SET ? WHERE oneKey = ?", [foo, foo.oneKey], callback); } 调用中指定只需要2个字符串,当传递3个字符串时,另一个字符串仍保留在缓冲区中,您需要刷新/使用它:

scanf