“怎么说?”;1.0“;在C语言中,浮点是整数吗?

“怎么说?”;1.0“;在C语言中,浮点是整数吗?,c,floating-point,C,Floating Point,我有一个程序,通过读取文件中的命令来接受命令。 在这个文件中,有些命令是“浮点字符串”,如“1.0”、“2.0”,但它们是无效的,程序需要的是整数,如“1”、“2”。那么,我怎样才能让程序理解像“1.0”这样的命令是无效的呢?有什么好办法吗 char buf[CMDSIZE]; if(fgets(buf, CMDSIZE, stdin)) //buf likes this: "1.0 \n" { *prio = 1; *command = -1;

我有一个程序,通过读取文件中的命令来接受命令。 在这个文件中,有些命令是“浮点字符串”,如“1.0”、“2.0”,但它们是无效的,程序需要的是整数,如“1”、“2”。那么,我怎样才能让程序理解像“1.0”这样的命令是无效的呢?有什么好办法吗

    char buf[CMDSIZE];
    if(fgets(buf, CMDSIZE, stdin))      //buf likes this: "1.0 \n"
    {
        *prio = 1; *command = -1; *ratio =1.0;
        // I need to make sure that command is not "1.0" or something like this              
        sscanf(buf, "%d", command);
        switch(*command){....blahblah......}
    }
谢谢。

读取输入时,
scanf(“%d”…)
scanf(“%f”…)
都将成功并返回1。(sscanf的工作原理与此相同。)只是使用
“%d”
,它将在小数点之前停止读取

您可以将格式说明符
%n
与sscanf一起使用,查看读取了多少字符,然后查看缓冲区是否包含更多内容

或者,更简单的方法是,用自己的代码(而不是sscanf)查看缓冲区中的内容,看看那里是否只有数字。

读取输入时,
scanf(“%d”)
scanf(“%f”)
都将成功并返回1。(sscanf的工作原理与此相同。)只是使用
“%d”
,它将在小数点之前停止读取

您可以将格式说明符
%n
与sscanf一起使用,查看读取了多少字符,然后查看缓冲区是否包含更多内容


或者,更简单的方法是,用自己的代码而不是sscanf查看缓冲区中的内容,看看那里是否只有数字。

使用strtol更容易

这将解析一个以10为基数的整数。指针
e
将指向整数后的第一个字符。您可以检查以确保它是NUL字节,否则会发出错误信号。(您还必须检查输入是否为空。)

如果您想在数字后允许空格/换行,也可以这样做。请注意,
strtol
使用前导空格,但不使用尾随空格

long v;
char *e;
v = strtol(buf, &e, 10);
if (!buf[0] || *e) {
    error();
}
// v has number

脚注:
strtol
检查溢出和下溢有点奇怪。您必须先将
errno
设置为0,调用
strtol
,然后检查结果是否为
LONG\u MIN
LONG\u MAX
,如果
errno
设置为
ERANGE
,则使用
strtol
更方便

这将解析一个以10为基数的整数。指针
e
将指向整数后的第一个字符。您可以检查以确保它是NUL字节,否则会发出错误信号。(您还必须检查输入是否为空。)

如果您想在数字后允许空格/换行,也可以这样做。请注意,
strtol
使用前导空格,但不使用尾随空格

long v;
char *e;
v = strtol(buf, &e, 10);
if (!buf[0] || *e) {
    error();
}
// v has number

脚注:
strtol
检查溢出和下溢有点奇怪。您必须首先将
errno
设置为0,调用
strtol
,然后检查结果是否为
LONG\u MIN
LONG\u MAX
,并且在您的特殊情况下
errno
是否设置为
ERANGE
,以检查1和1.0之间的差异 使用以下代码:

int ret = scanf("%d.%d",&i,&j);
如果输入为1,则scanf仅分配一个值,ret为1 如果输入为1.0,则scanf分配两个值,ret为2。 如果输入为abcd,则scanf无法分配任何值,ret为0

关于scanf、fscanf等的返回值

在C99标准7.19.6.4中,scanf功能

如果之前发生输入故障,scanf函数将返回宏EOF的值 任何转换。否则,scanf函数将返回输入项目的数量 分配的,在发生早期故障时,该值可以小于规定值,甚至为零
匹配失败

在您的特殊情况下,只需检查1和1.0之间的差异 使用以下代码:

int ret = scanf("%d.%d",&i,&j);
如果输入为1,则scanf仅分配一个值,ret为1 如果输入为1.0,则scanf分配两个值,ret为2。 如果输入为abcd,则scanf无法分配任何值,ret为0

关于scanf、fscanf等的返回值

在C99标准7.19.6.4中,scanf功能

如果之前发生输入故障,scanf函数将返回宏EOF的值 任何转换。否则,scanf函数将返回输入项目的数量 分配的,在发生早期故障时,该值可以小于规定值,甚至为零
匹配失败

您可以使用scanf和%f将其存储为浮点值 示例或使用%d扫描以将其存储为整数,但它不会计算小数

#include<stdio.h>
main()
{
float i;
int a;
printf("Enter a number which is a floating point value");
scanf("%f,%d",&i,&a);
}
#包括
main()
{
浮点数i;
INTA;
printf(“输入一个浮点数”);
scanf(“%f,%d”,&i,&a);
}
这里使用scanf和%f,我们将其存储在一个浮点变量i so 1.5,1.0中
或者将存储任何带小数点的数字,或者如果我们只使用%d,它将只存储1,2,3,4任何不带小数点的数字,也就是说,如果我们给出2.5,它将只存储2

您可以使用带%f的scanf将其存储为浮点值 示例或使用%d扫描以将其存储为整数,但它不会计算小数

#include<stdio.h>
main()
{
float i;
int a;
printf("Enter a number which is a floating point value");
scanf("%f,%d",&i,&a);
}
#包括
main()
{
浮点数i;
INTA;
printf(“输入一个浮点数”);
scanf(“%f,%d”,&i,&a);
}
这里使用scanf和%f,我们将其存储在一个浮点变量i so 1.5,1.0中
或者将存储任何带小数点的数字,或者如果我们只使用%d,它将只存储1,2,3,4任何不带小数点的数字,即如果我们给出2.5,它将只需要2

显示读取这些数字的代码。@aix问题更新。谢谢。请尝试使用sscanf(buf,“%f”,命令)进行浮点运算value@RolandXu这是我的软件调试作业。我只是发现这里有一个bug,因为正确的程序不会接受“1.0”。如果我将
%d
更改为
%f
,错误仍然存在。请向我们显示读取这些数字的代码。@aix问题更新。谢谢。请尝试使用sscanf(buf,“%f”,命令)进行浮点运算value@R