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

C 它正在编译,但每次都会崩溃,c,char,C,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 Cy

我对编程是个新手,我只是想做一个自己的程序来计算球体和圆柱体的体积和表面积。我不明白为什么这个程序在进入其余代码之前一直崩溃。我猜
字符*
可能是错的,但我不明白为什么会错

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.后崩溃。当我输入圆柱体或球体时,它崩溃。感谢您的帮助

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

申报后

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

 char solid[100];

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

solid
是一个字符指针,它不指向任何分配的内存位置,当您尝试使用
scanf()将数据读入时,这会导致程序崩溃。
(正如你所观察到的,这就是为什么它在那次呼叫后立即崩溃的原因)

申报后

 char *solid;
您应该
malloc()
为它指定一定量的存储空间。或者您可以声明一个名为
solid

 char solid[100];

请注意,崩溃实际上是一件好事,因为它有助于显示差事指针存在问题。不幸的是,根据内存中指针指向的位置,这种情况可能并不总是发生。

问题在于行

if(solid == "Cylinder" || solid == "cylinder")
不能比较像C中那样的字符串。请使用C中可用的strcmp库函数

代码应该如下所示

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

希望这有帮助。

问题出在线路上

if(solid == "Cylinder" || solid == "cylinder")
不能比较像C中那样的字符串。请使用C中可用的strcmp库函数

代码应该如下所示

if( (strcmp(solid,"Cylinder")==0) || (strcmp(solid,"cylinder")==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个字符,很可能会破坏堆栈并导致另一次崩溃


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

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个字符,很可能会破坏堆栈并导致另一次崩溃

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

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

  • “星”表示指针。指针必须指向内存中的某个位置,这可以通过malloc()、指针赋值/操作或显式位地址来完成。有关指针的更多信息,您可以阅读以下内容:(但说真的,指针?您提到过您是编程初学者