我是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 虽然我希望scanf只能读取2个字符串,但在file.txt的第2行上有3个字符串,但我想跳过第三个arg,这很麻烦,因为我只希望打印2个字符串,但是以某种方式我无法跳过特定字符串字符串。 我当前的输出: 我想要的输出: 请帮帮我。 我尝试包括[^]之类的正则表达式以排除包含空格的结果,但是没有解决问题。aman dhaker
rudra pratap hensome
nitesh dhakar
aman dhaker
rudra pratap hensome
nitesh dhakar
aman dhaker
rudra pratap
nitesh dhakar
答案 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