您好我是c编程的新手,我在使用fscanf获取文本文件中的十进制数时遇到问题。它总是给我2个数字而不是1个 示例:在文本文件中有:2.5
但在结果中它游戏我1个char类型(2。)和1个整数类型(5);
如何将十进制数作为int?
while((val = fscanf(stdin,"%d%c",&num ,&c)))
答案 0 :(得分: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值。
编辑:要测试double值是否为整数,只需比较d ==(int)d。当且仅当d恰好等于整数时才会成立。
PS:我在示例行中错过了stdin的使用。通常使用scanf()从stdin扫描。现在它看起来更像是键盘输入可能输入错误。为此,我倾向于使用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
}
答案 1 :(得分:1)
你得到的原因 num == 2和c == 5是因为你试图首先读取整数然后是char, 现在您的输入缓冲区包含 2 ,。, 5
当一个&#39; 。&#39;遇到了&#39; 。&#39;从输入缓冲区刷新,接下来你试图读取一个字符,因此&#39; <&#39; 进入c。
你可以做这样的事情
float tmp;
int num;
char c;
scanf("%f%c", &tmp, &c);
num = tmp; //this will truncate the decimal part
注意:请注意,如果您在读取字符后按Enter键并立即尝试再次读取字符,则换行符仍然位于输入缓冲区中并将作为下一个字符读取,您必须显式刷新它
答案 2 :(得分:0)
对于char,最好使用fgetc()而不是fscanf(fin,&#34;%c); 像这样使用它:
c=fgetc(fi); or fputc(c,fout);