0

我有一个程序通过从文件中读取命令来接受订单。在这个文件中有些命令是“float string”,比如“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......}
    }

谢谢你。

4

4 回答 4

3

读取输入1.0时,两者都scanf("%d"....)将成功并返回 1 。(sscanf 的工作方式相同。)只是与,它将在小数点之前停止读取。scanf("%f"....)"%d"

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

或者,这可能更容易,只需使用您自己的代码而不是 sscanf 查看缓冲区中的内容,看看那里是否只有数字。

于 2012-05-24T06:54:13.703 回答
3

它更容易使用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_MINorLONG_MAX以及是否errno设置为ERANGE

于 2012-05-24T07:04:52.887 回答
0

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

int ret = scanf("%d.%d",&i,&j);

如果inputs为1,scanf只赋值一个,ret为1 如果inputs为1.0,scanf赋值两个,ret为2.如果inputs为abcd,scanf不能赋值,ret为0

以及关于scanf、fscanf等的返回值。

在 C99 标准 7.19.6.4 中的 scanf 函数

如果在任何转换之前发生输入失败,scanf 函数将返回宏 EOF 的值。否则,scanf 函数返回分配的输入项的数量,如果发生早期匹配失败,该数量可能少于提供的数量,甚至为零

于 2012-05-24T07:19:21.577 回答
0

您可以使用带有 %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);
}

这里使用 scanf 和 %f 我们将其存储在浮点变量 i 中,因此 1.5,1.0 或任何带小数的数字将被存储,或者如果我们只使用 %d 它只会存储 1,2,3,4 任何数字小数点,即如果我们给 2.5 它只需要 2

于 2012-05-24T07:33:30.360 回答