C 忽略超过某一点的输入
有没有办法忽略当前行经过某个点的所有输入?这意味着如果scanf阅读:C 忽略超过某一点的输入,c,scanf,C,Scanf,有没有办法忽略当前行经过某个点的所有输入?这意味着如果scanf阅读: -rw-rw-r-- 1 lukasz lukasz 423 Jan 19 01:49 Make file 有没有办法忽略423之后的所有输入?我目前正在编写一个读取此行格式的程序,文件名中的空格有问题。这意味着读取make,然后文件将转入下一个scanf迭代。我是否遗漏了什么?我刚刚设置了七个变量s1。。。s0并运行以下命令: scanf("%s %s %s %s %s %s %s %s %s %s", s1,s2,s
-rw-rw-r-- 1 lukasz lukasz 423 Jan 19 01:49 Make file
有没有办法忽略423之后的所有输入?我目前正在编写一个读取此行格式的程序,文件名中的空格有问题。这意味着读取make,然后文件将转入下一个scanf迭代。我是否遗漏了什么?我刚刚设置了七个变量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);
charlinein[200];
chars[12][12];
char*p;
char*in=linein;
字符*文件;
fgets(线路输入、尺寸输出(线路输入)、标准输入);
对于(int ii=0;ii您可以忽略输入行的其余部分,格式字符串末尾有两个转换说明符:%*[^\n]%*c
:
%*[^\n]
读取换行符之前的所有字符并丢弃它们(这就是*
的作用)
%*c
读取并丢弃换行符
但是请注意,如果换行符之前没有要读取的字符,此方法将失败。您可以通过两个单独的调用scanf()
来解决此问题:
读一整行,用sscanf
来解析它,继续。然后什么都没有了。%*[^\n]
会起作用。它确实会在输入端保留\n
,但这通常由下一个scanf
处理。你可以尝试文件*fp=fopen(“文件名”,“r”);字符缓冲区[1024];fscanf(fp,%1023[!\n'],缓冲区);
将输入字符,直到遇到1023个字符输入-或-a'\n'。当然,代码需要检查fp
的内容(!=NULL),以确保调用fopen()
成功。当然,代码需要检查调用fscanf()返回的值。
(在本例中,除1以外的任何内容都将是错误)@user3629249:您的意思是fscanf(fp,“%1023[^\n]”,buffer);
?但是请注意,此格式将无法读取空行,导致潜在的未定义行为,因为未修改buffer
更简单、更安全。@chqrlie,您有权使用^
而不是!
。但是,如果文件为空或处于EOF,则返回的值将不会为1。因此,将捕获此类事件。当存在一个(并且只有一个)事件时,此操作有效文件名中的空格顺序。如果文件名中没有空格,或者名称中有多个空格顺序,则该选项不起作用。是的。只有当文件名中有且只有一个空格时,第一个scanf版本才会起作用。strtok版本适用于零个或多个空格,但这仅用于回答t如果你想遍历目录树,你可以使用readdir和其他逻辑。
scanf("%*[^\n]");
scanf("%*c");