为什么我的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;
}
有一些提示可以帮助您开始:
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*/