scanf忽略输入超过某一点

时间:2018-01-21 01:02:11

标签: c scanf

有没有办法忽略当前行的所有输入超过某一点?这意味着如果scanf读取:

-rw-rw-r-- 1 lukasz lukasz  423 Jan 19 01:49 Make file

有没有办法忽略423以后的所有输入?我目前正在研究一种读取这种行格式的程序,我在文件名中有空格。这意味着make被读取,然后文件将被转移到下一个scanf迭代中。

2 个答案:

答案 0 :(得分:1)

我在这里遗漏了什么吗?我只是设置了七个变量s1 ... s0并运行了这个:

scanf("%s %s %s %s %s %s %s %s %s %s", s1,s2,s3,s4,s5,s6,s7,s8,s9,s0);

并列出了

列表
-rw-rw-r--
1
lukasz
lukasz
423
Jan
19
01:49
Make
file

每当我有这样的事情要做时,我都会读完整行并用strtok处理这些作品。

---更新---

如果文件名中有多个空格或者名称以空格开头会发生什么?如果您保证文件名不以空格开头,则可以使用:

char linein[200];
char s[12][12];
char *p;
char *in=linein;
char *file;
fgets(linein,sizeof(linein), stdin);
for(int ii=0; ii<8; ii++) {
    p=strtok(in," ");
    in=NULL;
}
file=strtok(in,"\r\n");
printf("file=%s\n", file);

答案 1 :(得分:1)

您可以忽略输入行的其余部分,并在格式字符串末尾添加2个转换说明符:%*[^\n]%*c

  • %*[^\n]读取换行符之前的所有字符并将其丢弃(这是*的用途)
  • %*c读取并丢弃换行符。

但请注意,此方法将失败,因为在换行符之前没有要读取的字符。您可以通过对scanf()的两次单独调用解决此问题:

scanf("%*[^\n]");
scanf("%*c");