它正在编译但每次都会崩溃

时间:2012-09-03 03:19:47

标签: c char

我对编程很陌生。我只是想制作自己的程序来查找球体和圆柱体的体积和表面积。我无法弄清楚为什么这个程序会在它到达其余代码之前一直崩溃。我猜测char*可能是错的,但我不明白为什么会这样。

int main()
{
    char* solid;
    char* unit;
    printf("Welcome to the Center of Spheres and Cylinders!\n");
    printf("Would you like to look at a Sphere or a Cylinder?: ");
    scanf("%s", solid);
        if(solid == "Cylinder" || solid == "cylinder")
        {
            printf("You chose to look at a Cylinder.\n");

        else if(solid == "Sphere" || solid == "sphere")
        {
            printf("You chose to look at a Sphere.\n");

在我输入scanf.之后崩溃了...当我输入圆柱体或球体时它会崩溃。谢谢你的帮助

4 个答案:

答案 0 :(得分:3)

solid是一个字符指针,指向任何已分配的内存位置,当您尝试将数据读入其中时导致程序崩溃使用scanf()(这就是为什么它会在你观察到的那个电话之后崩溃的原因)。

宣布

之后
 char *solid;

您应malloc()指定一定数量的存储空间。或者,您可以声明一个名为solid

的数组
 char solid[100];

请注意,崩溃实际上是一件好事,因为显示错误指针有问题是有帮助的。不幸的是,这可能并不总是发生,这取决于内存中的指针指向的位置。

答案 1 :(得分:0)

问题在于

if(solid == "Cylinder" || solid == "cylinder")

U无法比较C中的字符串,而是使用C中提供的strcmp库函数。

代码应该如下所示

if( (strcmp(solid,"Cylinder")==0) || (strcmp(solid,"cylinder")==0) )

希望这有帮助。

答案 2 :(得分:0)

char* solid;创建一个指向任意位置的字符指针(至少对于自动变量,这是您在代码中所拥有的)。然后,当您尝试sccanf进入该位置时,您将调用未定义的行为,因为没有有效的后备存储。

char solid[100]; 这样的东西会创建后备存储,解决这个直接问题,因为它为要存储的字符分配空间。但是,您的代码至少还有两个问题。


首先,你不要将C中的字符串与==进行比较,它只是比较指针,而不是指针后面的 。为了比较内容,C提供strcmp函数,而不是:

if (solid == "something")

你应该:

if (strcmp (solid, "something") == 0)

某些实现也可能提供忽略大小写的stricmp,因此您不必这样做:

if ((strcmp (solid, "something") == 0) || (strcmp (solid, "Something") == 0))

改为:

if (stricmp (solid, "something") == 0)

允许任何字符为大写或小写,例如SomeThing

但是,这不是标准C,因此可能无处可用。


你的另一个主要问题在于scanf("%s")。在这里使用无界字符串是不安全的,因为如果用户输入的内容超出预期,则会遇到缓冲区溢出。例如,如果您使用上述char solid[100]并且用户输入了500个字符,则可能会丢弃您的堆栈并导致另一次崩溃。

如果您想要一个真正强大的用户输入功能,请查看this one。它具有溢出保护功能,并在必要时丢弃线路的其余部分,以便后续输入不受影响。

答案 3 :(得分:0)

正如其他人所指出的,你的程序有几个“缺陷”:

  1. “星号”表示指针。指针必须指向内存中的位置,这可以通过malloc(),指针赋值/操作或显式位地址来完成。有关指针的更多信息,您可以阅读:http://pw1.netcom.com/~tjensen/ptr/pointers.htm(但严肃地说,指针?您已经提到过您是编程的初学者;指针不仅是C语言中的高级概念,还是计算机科学中的高级概念无论如何,现在不要过多考虑它们。)

  2. C中的字符串比较不是由简单的等式运算符完成的,而是通过位比较(由库自动完成)完成的。等于运算符(==)仅比较基本类型(int,char等),但不比较用户定义的类型或数组(字符串是字符数组)。您必须使用strcmp()(或strncmp()来比较可选偏移量中的前n个字节)。您可以在Google上搜索strcmp()和strncmp()的文档以获取更多信息。

  3. 记住这些概念,您的程序将是这样的:

    #include <string.h> /**Contains string manipulation functions; very important **/
    #include <ctype.h> /**Contains tolower() **/
    int main()
    {
        char* solid;
        char* unit;
    
        printf("Welcome to the Center of Spheres and Cylinders!\n");
        printf("Would you like to look at a Sphere or a Cylinder?: ");
        scanf("%s", solid);
    
        if(strcmp(tolower(solid), 'cylinder') == 0)
        {
            printf("You chose to look at a Cylinder.\n");
    
        else if(strcmp(tolower(solid), 'sphere') == 0)
        {
            printf("You chose to look at a Sphere.\n");
    
        }
        /** Other code here **/
        return 0;
    }
    

    正如您可能已经猜到的那样,tolower()将字符串转换为小写。另外一个FYI,一个数组是一个指针,因此使用“星号”符号来存储scanf输入的理由。