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.圆柱体或球体时它崩溃了。感谢您的帮助

4

4 回答 4

3

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

声明后

 char *solid;

你应该malloc()有一定的存储空间让它指向。或者,您可以声明一个名为的数组solid

 char solid[100];

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

于 2012-09-03T03:20:58.857 回答
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() 将字符串转换为小写。另外仅供参考,数组是一个指针,因此使用“星号”表示法存储来自 scanf 的输入的理由。

于 2012-09-03T03:54:28.483 回答
0

问题出在线路上

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

U 不能像 C 中那样比较字符串。而是使用 C 中可用的 strcmp 库函数。

代码应该如下所示

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

希望这可以帮助。

于 2012-09-03T03:24:25.807 回答
0

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

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


第一个是你不比较 C 中的字符串与==,它只是比较指针,而不是指针后面的内容。为了比较内容,C提供了一个strcmp函数so,而不是:

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

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

于 2012-09-03T03:39:41.697 回答