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个字符,很可能会破坏堆栈并导致另一次崩溃
如果您想要一个真正强大的用户输入功能,请看一看。它具有溢出保护,并在必要时丢弃行的其余部分,以便后续输入不受影响。正如其他人所指出的,您的程序有几个“缺陷”: