繁体   English   中英

如何使用fscanf将任何字符读入字符串,直到到达选项卡?

[英]How to use fscanf to reads any character into a string until a tab is reached?

如何使用fscanf将任何字符读入字符串,直到到达选项卡?

我的数据文件只有一行:

123'\t'(Tab)345'\t'Le Duc Huy'\t'567

我使用像这样的fscanf:

fscanf(fin,"%d %d %d %[^\t]%s %d",&m,&n,&k,s,&q);

它以错误的值返回q。 谁能告诉我是什么让它失败了?

使用fscanf() ,您将需要一个否定的字符类和长度:

char string[32];

if (fscanf(fp, "%31[^\t]", string) != 1)
    ...error or EOF...

问题的修改版本在最终选项卡后面有一个带有单引号的数据字符串,并且单引号无法转换为整数,因此q的值未定义。 请注意,您必须检查fscanf()的返回值,以确保您希望匹配的所有字段实际匹配,在上下文中,如果可能返回值4而不是5,则告诉您出现错误。

而不是fscanf我会使用fgetc (虽然我的语法可能有点偏差):

int c;
string s = "";
for (;;)
{
    c = fgetc(somefile);
    if (c == '\t' || c == EOF) break;
    s += c;
    // ...
}

这是fscanf()版本:

fscanf (stream, "[^\t]", output);

注意,这不安全!


char foo[100];
scanf("%s\t", foo);

您无法阻止用户溢出缓冲区

消除%[之前的空间。 它在吃你的标签。 此外,正如其他人所说,这段代码是不安全的,并且可能在输入上不可靠,而且输入的格式与预期不完全相同。 最好使用fgets ,然后使用strtol和一些for循环自己解析它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM