Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的c程序不能工作_C_Linux - Fatal编程技术网

为什么我的c程序不能工作

为什么我的c程序不能工作,c,linux,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");

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

#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;
}
#包括
#包括
内部主(空)
{
char*a=“是”;
char*b=“否”;
char*c=“”;
puts(“\n键入“是”或“否”进行选择\n”);
放置(“您喜欢冰淇淋吗”\n);
scanf(“%c”和*c);
如果(*c==*a){
看跌期权(“您赢得100000000美元”);
}
如果(*c==*b){
卖出(“你损失了50美元”);
}
返回0;
}

有一些提示可以帮助您开始:

  • 将用户的答案存储为字符串,而不是指向char变量的指针。因此,您可以使用
    charc[4]
    而不是使用
    char*c
  • 获取用户答案时,使用
    scanf(“%s”,c)
    ,因为用户的输入将是
    yes
    no
    ,这是一个字符串,而不是一个字符
  • 当比较用户的答案和定义的答案时,请使用
    strcmp
    方法,因为您比较的是字符串,而不仅仅是字符

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

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

    char *c = "";
    

    在扫描字符串时,使用

    scanf("%s",c); 
    
    要知道变量分配到内存的位置(供参考),

    scanf(“%c”和*c)

    此行尝试将用户输入存储到
    const char*
    中。 一旦您声明如下内容:

    char*foo=“bar”

    你不能改变它

    如果要更改字符串,必须使用
    malloc()
    自动或动态分配内存

    char foo[10]=“bar”
    或者干脆
    char foo[10]

    char*a=“是”

    假设您的地址从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;
    }
    
    char*b=“否”; char*c=“”

    c所指的地址位于静态内存区域,并注意到“”的长度仅为一个字符。
    所以,在使用c之前,您可以使用malloc

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

    您不必要地使用了指针。即使没有指针,你的目标也很容易实现

    char *c = "";  /* Wrong */
    
    因为您使用的是scanf()运算符,所以不必为“c”赋值。所以

    char c;  /*would be fine*/
    

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

    提示:char*c=“”;然后是scanf(“%c”&*c);这是非常基本的东西。1)要输入字符串“是”或“否”,请使用
    %s
    格式说明符。2) 要比较字符串,请使用
    strcmp
    库函数,不能仅通过
    =
    进行比较。3) 为
    c
    指针分配一些内存。@0xF1:如果
    c
    指向可修改内存,他可以使用
    %c
    。他可以比较字符串的前几个字符,如图所示,但他应该涵盖输入既不是
    y
    也不是
    n
    @JonathanLeffler:对,他也可以这样做。请使用所有警告和调试信息(即
    gcc-Wall-g prog.c-o myprog
    )编译并学习如何使用调试器(使用
    gdb myprog
    )4.学习如何拼写“lose”:-)但千万不要在生产代码中使用#2(教育、作业或快速“脏”应用程序可能没问题)-它会让你面临缓冲区溢出攻击。@paxdiablo。你的意思是最好使用
    fgets
    ,因为我们可以指定最大长度?rcs,是的,我最喜欢的一个:我试过了,但它说max未声明包括这个#define max 10抱歉,它通过在
    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;
    }
    
    char *a =  "yes";
    
    char *a =  "yes"; /*Wrong*/
    char *b = "no";   /*Wrong*/
    
    char *c = "";  /* Wrong */
    
    char c;  /*would be fine*/