【问题标题】:why wont my c program work [closed]为什么我的c程序不能工作[关闭]
【发布时间】:2013-11-15 03:49:18
【问题描述】:

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

#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 *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

标签: c linux


【解决方案1】:

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

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

【讨论】:

  • 4.学习如何拼写“loose” :-) 但永远不要在生产代码中执行 #2(教育、作业或快速'n'dirty 应用程序可能还可以)——它会让你面临缓冲区溢出攻击。
  • @paxdiablo。你的意思是最好使用fgets,因为我们可以指定最大长度?
  • rcs,是的,我的最爱:stackoverflow.com/questions/4023895/…
【解决方案2】:
char *c =  "";

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

【讨论】:

    【解决方案3】:

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

    char *c = "";
    

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

    在扫描字符串时,使用

    scanf("%s",c); 
    

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

    【讨论】:

    • 我试过了,但它说 MAX 未声明
    • 包括这个#define MAX 10
    • 很抱歉,在里面放了一个数字
    【解决方案4】:

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

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

    char *foo = "bar";

    你不能改变它。

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

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

    【讨论】:

      【解决方案5】:
      char *a =  "yes";
      

      char *b = "否"; char *c = "";

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

      【讨论】:

        【解决方案6】:

        char *a="yes";

        +----------+
        |    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;
        }
        

        【讨论】:

          【解决方案7】:

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

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

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

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

          您不必为“c”分配任何内容,因为您使用的是 scanf() 运算符。所以

          char c;  /*would be fine*/
          

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-03-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-07-21
            • 2014-10-09
            • 1970-01-01
            相关资源
            最近更新 更多