-4

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

#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;
}
4

7 回答 7

2

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

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

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

于 2013-11-15T03:54:32.630 回答
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

于 2013-11-15T03:55:45.940 回答
0

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

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

char *foo = "bar";

你不能改变它。

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

char foo[10] = "bar"; 或者干脆char foo[10]

于 2013-11-15T04:13:50.327 回答
0

字符 *a="是";

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

假设您的地址从 4000 开始,那么这就是字符在内存中的存储方式,并且 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;
}
于 2013-11-15T04:24:40.917 回答
0
char *a =  "yes";

字符 *b = "否"; 字符 *c = "";

c 指向的地址在静态内存区,注意“”的长度只有一个字符。所以,你可以在使用之前 malloc for c !

于 2013-11-15T04:25:29.460 回答
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”的地址。

于 2013-11-15T06:08:54.353 回答