2012-09-03 81 views
0

我是全新的编程..我只是想让我自己的程序找到球体和圆柱体的体积和表面积。我无法弄清楚为什么这个程序在它到达代码的其余部分之前会一直崩溃。我猜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. ..when我任一气缸中键入或球体崩溃。感谢您的帮助

回答

3

solid是一个字符指针,它是指着这是造成程序崩溃任何分配存储位置,当您尝试将数据读入其与scanf()(并且这是为什么呢按照您的观察,在该呼叫之后立即崩溃)。

后声明

char *solid; 

你应该malloc()一定量的存储空间为它指向。或者你也可以声明命名solid

char solid[100]; 

注意,崩溃,实际上对我们是有帮助的显示有与差事指针的一个问题是好事数组。根据内存中的指针指向的位置,这可能并不总是会发生。

+0

所以我决定宣布它作为一个数组,并停止崩溃!但现在只是没有执行任何其他代码...它将采取从 scanf(“%s”,固体)的输入; 但程序结束.. 再次感谢您的帮助 – Karssassin

0

的问题是与线

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

你无法比较喜欢那个字符串C.而是利用现有的strcmp库函数C.

的代码应该是类似下面

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

希望这会有所帮助。

+0

是的,Levon是对的。在scanf部分之后,您可以像上面所说的那样比较字符串。 –

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。它具有溢出保护功能,并在必要时丢弃其余部分,以便后续输入不受影响。

0

你的程序有一些“破绽”,正如有人指出:

  1. “明星”是指一个指针。指针必须指向内存中的某个位置,这可以通过malloc(),指针分配/操作或显式位地址来完成。关于指针的更多信息,你可以阅读:http://pw1.netcom.com/~tjensen/ptr/pointers.htm(但是,严格来说,指针?你已经提到你是编程的初学者;指针不仅是C语言中的高级概念,而且也是计算机科学中的高级概念。现在不想太多了。)

  2. 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的输入是合理的。

+0

'tolower()'只适用于角色。字符串的有效语法是用双引号'“str”' – Yno

+0

@Yno:谢谢你的更正。只是从PHP的结转。 – shippou