简单的C代码错误

时间:2014-06-25 20:23:19

标签: c stack malloc free

有人知道为什么我在运行此代码时会遇到段错误吗? Valgrind告诉我,我在第13行 if(!isdigit(x))上有“未初始化的4号值”,并且同一行上的读取大小2无效 - 地址未堆叠, malloc'd,或free'd。

#include <stdio.h> 
#include <stdlib.h>
#include <ctype.h>
#include <stdbool.h>

int main()
{
    int x;

    printf("Please enter a number: ");
    scanf("%d", &x);

    if( !isdigit(x) )
    {
        printf("You entered %d\n", x);
    }
    else
    {
        printf("You did not enter a valid number!\n");
    }

    return 0;
}

4 个答案:

答案 0 :(得分:1)

我认为问题是如果scanf失败,x将被取消初始化。 最好在字符数组中输入数据。否则,您的代码没有任何意义,因为您无法在int类型的对象中输入非数字。此外,如果输入数字,使用函数isdigit的结果可能会出乎意料。

答案 1 :(得分:1)

我用g ++编译你的代码,导致没有段错误。

输入值:

5,-1,27,43545gbb和gggg

产生了结果:

5,-1,27,43545和1729208414

答案 2 :(得分:0)

尝试以下方法:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int x = 0;
    char a;

    printf("Please enter a number: ");

    while(scanf("%d%c",&x,&a) != 2 || a != '\n')
    {
        printf("Please enter an integer only : ");
        do
        {
            scanf("%c",&a);
        }while(a != '\n');
    }

    printf("You entered %d\n", x);
    return 0;
}

代码向您展示了如何使用scanf的复杂方法。有关详细信息:Working of scanf and checking if input is int

根据c文档:isdigit

原型:

int isdigit( int ch );

参数:

ch  -   character to classify

目的:

  

检查给定字符是否为数字字符(0123456789)。   如果ch的值不能表示为 unsigned char 且不等于EOF,则行为未定义。

返回值:

  

如果字符是数字字符,则为非零值(true),否则为0(false)。

答案 3 :(得分:-1)

为什么第13行出现问题? 。第13行是if( !isdigit(x) )
在第8行创建x时,没有初始化x,
因此,如果输入了一个不可接受的值,并在第11行由scanf()处理,则它将在到达isdigit()函数时继续未初始化。

问题是isdigit()期望输入必须是整数值在0到255之间的字符。任何其他值都将导致未定义的行为 Segfaults是未定义行为的可能结果之一。

还有其他方法可以实现这一点,例如:
以下是使用char数组(字符串)的示例。请注意注释,以解释为什么某些事情已经完成。

int main()
{
    //int x;
    char x[2];  //Good for only one digit

    printf("Please enter an integer with up to 10 digits: ");
    //scanf("%d", &x); 
    scanf("%1s", x); //Edited to allow maximum field width of 1.

   // if( !isdigit(x) )        
    if( isdigit(x[0]) ) //note the "!" was removed for logic to work
    {
        printf("You entered %d\n", atoi(x)); //note use of atoi() to convert string to int.
    }
    else
    {
        printf("You did not enter a valid number!\n");
    }

    return 0;
}