嗨,我是 c 编程新手,我无法使用 fscanf 在文本文件中获取十进制数。它总是给我 2 个数字而不是 1 个示例:在文本文件中有:2.5
但结果它让我玩了 1 个字符类型(2.)和 1 个整数类型(5);
我怎样才能得到十进制数作为int?
while((val = fscanf(stdin,"%d%c",&num ,&c)))
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
}
您获得 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 并立即尝试再次读取一个字符,则换行符仍驻留在输入缓冲区中并将作为下一个字符读取,您必须显式刷新它
对于 char 来说,使用 fgetc() 比使用 fscanf(fin,"%c); 更好; 像这样使用它:
c=fgetc(fi); or fputc(c,fout);