我有一点问题: 我希望fgets()表现得像scanf("%d",...) - 读取输入到空白,而不是整行。有没有办法让它像那样工作?
提前致谢
答案 0 :(得分:1)
使用fgets()
将整行保存到char数组中。然后编写一个函数,使用strtok()
将行切割成子串,用空格分隔,并检查每个子串以查看它是否只包含数字。如果是这样,请使用sscanf()
从该子字符串读取变量。
或者,您可以首先使用fscanf()
,格式为"%s"
,以便从文件中读取字符串。到达分隔符(空格,新行等)时,fscanf()
将停止阅读。检查读取的字符串,如果它包含有效数字,请使用sscanf()
或atoi()
将其转换为数字值。
我想出了这段代码:
#include <stdio.h>
#define VALUE_NOT_PRESENT -1 /* A value you won't expect in your file */
int main()
{
FILE *f;
char s[256];
int n;
f = fopen ("test.txt","r");
fscanf (f, "%s", s);
while (!feof(f))
{
n = VALUE_NOT_PRESENT;
sscanf (s, "%d", &n); /* if s cannot be converted to a number, n won't
be updated, so we can use that to check if
the number in s is actually a valid number */
if (n == VALUE_NOT_PRESENT)
printf ("Discarded ");
else
printf ("%d ", n);
fscanf (f, "%s", s);
}
fclose (f);
printf ("\n");
return 0;
}
如果读取的字符不能形成有效数字,则使用*scanf
族函数的功能不更新变量。
使用包含此内容的文件执行:
1 2 -3
-4 abc
5 6 a12 6c7
它能够将abc
和a12
识别为无效数字,因此会被丢弃。不幸的是,它将6c7
识别为6
。我不知道这对你是否合适。如果没有,您可能必须编写一个函数,该函数将使用状态机驱动的解析器接受或拒绝该字符串作为数字。我不知道标准库中是否存在这样的功能,但肯定可以在那里使用。