为什么我的c程序不工作

时间:2013-11-15 03:49:19

标签: c linux

这个代码有什么问题它编译没有错误但是当我运行它时我得到一个总线错误

#include <wchar.h>
#include <stdio.h>


int main(void)
{
char *a =  "yes";
char *b = "no";
char *c = "";

        puts ("\ntype yes or no for selection\n");
        puts ("do you like icecream\n");
        scanf("%c", &*c);

                if (*c == *a){
                puts("you win $1000000000");
                }

                if (*c == *b){
                puts("you loose $50");
                }
return 0;
}

7 个答案:

答案 0 :(得分:2)

有一些提示可以帮助您入门:

  1. 将用户的答案存储为字符串,而不是指向char变量的指针。因此,您可以使用char *c
  2. ,而不是使用char c[4]
  3. 获取用户的答案时,请使用scanf("%s", c);,因为用户的输入将是yesno,这是一个字符串,而不是字符。
  4. 将用户的答案与定义的答案进行比较时,请使用strcmp方法,因为您正在比较字符串,而不仅仅是字符。

答案 1 :(得分:2)

char *c =  "";

声明c指向不可写内存中零长度字符串的指针。所以scanf()没有要写入的字节,如果没有,则无法写入。

答案 2 :(得分:0)

您需要为指针c分配内存。您正在尝试扫描字符串。但是字符串将被存储在哪里? 改变以下

char *c = "";

char c[MAX]; //you #define MAX to maximum length of the string.

扫描字符串时,请使用

scanf("%s",c); 

要知道变量在哪里分配内存(供参考),https://stackoverflow.com/a/18479996/1814023

答案 3 :(得分:0)

scanf("%c", &*c);

此行尝试将用户的输入存储到const char *。 一旦你声明了类似的东西:

char *foo = "bar";

你不能改变它。

如果您打算更改字符串,则必须使用malloc()自动或动态地分配内存。

char foo[10] = "bar"; 或者只是char foo[10]

答案 4 :(得分:0)

char * a =“是”;

+----------+
|    y     |     4000
+----------+ 
|    e     |     4001
+----------+
|    s     |     4002
+----------+
|    \0    |     4003
+----------+

假设您的地址从4000开始,那么这就是将charcaters存储在内存中的方式,并将4000分配给a。这同样适用于其他两个定义。所以你在c中存储一个空字符。 此外,a,b,c都是只读存储器,您无法在运行时修改或存储数据。

您获得字符串输入,但只比较字符。相反,你可以得到一个字符输入。简单。

int main(void)
{
    char *a="yes";
    char *b="no";
    char *c=malloc(sizeof(char));
    puts ("\ntype yes(y) or no(n) for selection\n");
    puts ("do you like icecream\n");
    scanf("%c",c);
    if (*c == *a)  puts("you win $1000000000");
    if (*c == *b)  puts("you lose $50");
  return 0;
}


int main(void)
{
    char c;
    puts ("\ntype yes(y) or no(n) for selection\n");
    puts ("do you like icecream\n");
    scanf("%c",&c);
    if (c == 'y')  puts("you win $1000000000");
    if (c == 'n')  puts("you lose $50");
return 0;
}

答案 5 :(得分:0)

char *a =  "yes";

char * b =“no”; char * c =“”;

c指向的地址位于静态内存区域,并注意到“”的长度只是一个char。 所以,在使用之前你可以使用malloc for c!

答案 6 :(得分:0)

如果将变量定义为字符(char),则它只能保存一个字节(8位)。否则,您需要将变量声明为字符串(%s)。如果您需要使用字符,您可以让用户输入字符“y”表示“是”,字符“n”表示“否”。

char *a =  "yes"; /*Wrong*/
char *b = "no";   /*Wrong*/

您已经不必要地使用了指针。即使没有指针,您的目标也可轻松实现。

char *c = "";  /* Wrong */

由于您使用的是scanf()运算符,因此无需为“c”指定任何内容。所以

char c;  /*would be fine*/

当用户输入“y”或“n”之一时,该字符将被复制到“c”的地址。