1

嗨,我是 c 编程新手,我无法使用 fscanf 在文本文件中获取十进制数。它总是给我 2 个数字而不是 1 个示例:在文本文件中有:2.5

但结果它让我玩了 1 个字符类型(2.)和 1 个整数类型(5);

我怎样才能得到十进制数作为int?

while((val = fscanf(stdin,"%d%c",&num ,&c)))
4

3 回答 3

2

2.5 不是 int 值。您必须将其扫描并存储为浮点类型,最好是双精度:

int n;
double d;
FILE *infile;
...
n = fscanf(infile, "%lf", &d);
if (n!=1) 
{ 
    ... handle bad input ... 
}

然后,您可以转换为 int 或其他。double 的原因是 float 不能准确地表示所有 32 位 int 值。

编辑:要测试双精度值是否为整数,只需比较 d == (int)d。当且仅当 d 完全等于整数时,这将是正确的。

PS:我错过了示例行中标准输入的使用。通常使用 scanf() 从标准输入进行扫描。现在看起来更像是键盘输入可能会出现打字错误。为此,我倾向于使用 fgets() 获取字符串并使用 sscanf() 进行转换和验证:

char input[82];
...
while (fgets(input, sizeof(input), stdin) != NULL)
{
    int value;
    char ignore;
    int n = sscanf(input, "%d %c", &value, &ignore);
    if (n != 1)
    { ... invalid input: print message & continue; }
    ... do something with value 
}
于 2013-09-19T01:26:23.643 回答
1

您获得 num == 2 和 c == 5 的原因是因为您尝试先读取整数然后读取字符,现在您的输入缓冲区包含2 , . , 5

当 ' 时停止读取整数' 遇到和 ' ' 从输入缓冲区中刷新,接下来您尝试读取一个字符,因此'5'进入 c。

你可以做这样的事情

float tmp;
int num;
char c;
scanf("%f%c", &tmp, &c);
num = tmp; //this will truncate the decimal part

注意:请注意,如果您在读取一个字符后按 Enter 并立即尝试再次读取一个字符,则换行符仍驻留在输入缓冲区中并将作为下一个字符读取,您必须显式刷新它

于 2014-08-19T10:13:46.847 回答
0

对于 char 来说,使用 fgetc() 比使用 fscanf(fin,"%c); 更好; 像这样使用它:

c=fgetc(fi); or fputc(c,fout);
于 2015-01-15T17:09:47.610 回答