C语言 - 如何检查数字是整数还是浮点数?

7

练习30

编写一个程序,读取作为小数扩展开发的浮点值,并执行以下操作:

  • 如果它是整数,则显示它是整数
  • 否则,将其四舍五入为整数并打印结果。

请注意数据控制

这里是一个没有有关整数类型的消息的新版本。

#include <stdio.h>
#include <math.h>

int main(){
    double x;              //the argument of f(x)
    printf("Program demands x");
    printf("\nand writes the rounded value\n");
    printf("Author: xXx\n\n");
                          //loading data
    printf("Write x in float type in decimal extension  "); // after many tries, program is not rounding the value
    if (scanf("%lf",&x)!=1 || getchar()!='\n'){
        printf("Wrong data.\n");
        printf("\nEnd of program.\n");
        return 0;     
    }
    double round( double x );
    printf( "Rounded value is = %lf\n", x);
    printf("\nEnd of program.\n");
    return 0;   
}

4
您的问题似乎不太合理,因为要使用 scanf,您必须知道正在分配的类型。因此,根据这种逻辑,您已经知道了该类型。如果我理解有误,请纠正我,但我认为您的问题可能是要确定用户输入的数字(来自字符串)是整数还是浮点数。 - jrd1
1
是的,但问题在于如果我使用scanf,我需要声明我想要的类型。那么如何声明我不确定的类型,因为它取决于用户输入的数字呢? - tdbr
3
问题是确定输入是否具有“浮点”形式(具有小数点或指数)或具有非整数值?“1.0”具有浮点形式,但是是一个整数。“1/2”没有浮点形式,但不是整数。程序是否需要具有区域设置敏感性(根据用户设置识别“,”或“。”作为小数点)? - Eric Postpischil
1
@EricPostpischil 是的,就是这样 - tdbr
1
@teddybear:哪一个?第一个问题不是肯定或否定的,而是二选一:问题是检查输入的格式还是?还有第二个问题,是肯定或否定的:程序是否需要支持本地化? - Eric Postpischil
显示剩余8条评论
4个回答

18

我建议如下:

  1. 将数字读入浮点变量val中。
  2. val的整数部分放入int变量truncated中。
  3. 检查valtruncated是否相等。

该函数可能如下所示:

bool isInteger(double val)
{
    int truncated = (int)val;
    return (val == truncated);
}

如果val超出了可以存储在int中的值的范围,您可能需要添加一些检查。

请注意,我假设您希望使用数学家对整数的定义。例如,此代码将认为"0.0"指定了一个整数。


1
但如果输入是123.0呢? - perreal
1
在C语言中,它是一个浮点数 :) 不过我理解你的观点。 - perreal
1
不,123.0 明显不是整数,它有一个小数点和小数分数。我想你可能想声称它在某种容差范围内是整数。 - High Performance Mark
1
在数学领域,我相当有信心认为123.0是一个整数。你对容差的评论让我发笑。 - David Heffernan
3
小心,先生们,我们仍在讨论“计算机”,而不是“数学”。 并非每个可能的整数都可以存储在“int”整数中-或者说,在“float”或“double”中。楼主可能需要澄清他所谓的“整数”。 (另外,“123.0”对于“123.00000001”是完全合理的表示方式;) - Jongware
显示剩余3条评论

9

保持简单:

  1. Read input as a string to a buffer fgets(buffer, BUFFER_SIZE, stdin);

  2. Use sscanf to try reading integer:

    int i, r, n;
    r = sscanf(buffer, "%d%n", &i, &n);
    if(r == 1 && n == strlen(buffer)) {
        // is integer
    }
    

    Extra length check here is to make sure that all characters are evaluated, and number like 12.3 won't be accepted as 12.

  3. If previous step failed, try reading floating point:

    double dbl;
    r = sscanf(buffer, "%lf", &dbl);
    if(r == 1) {
            // is double
    }
    

+1 我认为这是一个好答案。 - David Heffernan
好的,我认为这不是我的水平,也许有更简单的解决方案。 - tdbr
1
我认为在 %n 前面加一个空格会更好,这样可以跳过尾随的空格。然后,您可以检查结尾处的字符是否为 null 字节——如果是,则存在(可能为空的)前导空格、数字和(可能为空的)尾随空格。我会在两个测试中都使用 %n - Jonathan Leffler

0
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main() {
    char buffer[128], *p = buffer; 
    int   isint;
    fgets(buffer, sizeof buffer, stdin);
    if (p[0] == '+' || p[0] == '-')
      p++;
    isint = strlen(p) - 1;
    for (; *p && *p != '\n' && isint; p++) {
        isint = isdigit(*p);
    }   
    if (isint)
        printf("Woaaa\n");
    return 0;
}

基于比较输入字符串和使用扫描整数创建的字符串,稍微更清晰的版本:

#include <stdio.h>
#include <string.h>
int main() {
    char buffer[128], tostr[128];
    int d;
    fgets(buffer, sizeof buffer, stdin);
    buffer[strlen(buffer) - 1 ] = 0;
    sscanf(buffer, "%d", &d);
    sprintf(tostr, "%d", d); 
    if (!strcmp(buffer, tostr)) {
        printf("Woa\n");
    }
    return 0;
}

2
我发现这里缺乏解释性的文本,让人感到失望。 - David Heffernan

0
我建议您可以通过字符串获取输入,并检查它是浮点数还是整数。
例如:
#define IS_FLOAT = 1;
#define IS_INT = 2;
int main()
{
    char tempString[20];

    scanf("%s", tempString);

    if(checkType(tempString)==IS_INT)
        printf("This is integer\n");    
    else if(checkType(tempString)==IS_FLOAT)
        printf("This is Float");
    else
        printf("undifined");
}

int checkType(char *input)
{
    short int isInt=0;//we use int as a boolean value;
    short int isFloat=0;
    short int isUndifined=0;
    int count;

    for(count = 0 ; input[count ]!='\0'; count++)
    {
        if(isdigit(input[count]))//you should include ctype.h at the beginning of this program
            isInt=1;
        else if(input[count] == '.')
            isFloat=1;
        else
            return -1;//some character that neither int nor '.' char.
    }
    if(isInt == 1 && isFloat ==1)
        return IS_FLOAT;
    else if(isInt == 1 && isFloat ==0)
        return IS_INT;
    else
        return -1;//illegal format
}

checkFunction()是什么? - condorwasabi
应该是checkType。我忘记改函数名了。 - Ray
1
但是,如果数字是整数,则checkType()返回IS_INT(即2),如果是浮点数,则返回IS_FLOAT(即1)。在您的主函数中,if子句中的测试是错误的,因为您检查checkType()返回的值是否为true(非0)或false(0)。因此,printf("undifined");将永远不会被执行。 "if"和"else if"具有相同的测试条件,这也是一个错误,因为这些条件应始终是不相交的。 - condorwasabi
@condorwasabi 你是对的。抱歉我写得太快了。 - Ray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接