我对编程很陌生。我只是想制作自己的程序来查找球体和圆柱体的体积和表面积。我无法弄清楚为什么这个程序会在它到达其余代码之前一直崩溃。我猜测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.
之后崩溃了...当我输入圆柱体或球体时它会崩溃。谢谢你的帮助
答案 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)
正如其他人所指出的,你的程序有几个“缺陷”:
“星号”表示指针。指针必须指向内存中的位置,这可以通过malloc(),指针赋值/操作或显式位地址来完成。有关指针的更多信息,您可以阅读:http://pw1.netcom.com/~tjensen/ptr/pointers.htm(但严肃地说,指针?您已经提到过您是编程的初学者;指针不仅是C语言中的高级概念,还是计算机科学中的高级概念无论如何,现在不要过多考虑它们。)
C中的字符串比较不是由简单的等式运算符完成的,而是通过位比较(由库自动完成)完成的。等于运算符(==)仅比较基本类型(int,char等),但不比较用户定义的类型或数组(字符串是字符数组)。您必须使用strcmp()(或strncmp()来比较可选偏移量中的前n个字节)。您可以在Google上搜索strcmp()和strncmp()的文档以获取更多信息。
记住这些概念,您的程序将是这样的:
#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输入的理由。