您好我是C语言的新手,我似乎无法找到导致while循环开始后出现段错误的问题。
int main() {
char option;
char nickname;
printf("Welcome to our chat program. Please select mode (Send,Nickname,Exit): ");
while (gets(option)) {
if(!strncmp(option, "Exit", 4)) {
break;
}
if(!strncmp(option, "Nickname", 8)){
set_nickname(nickname);
}
if(!strncmp(option, "Send", 4)){
if(!nickname){
nickname = "Anonymous";
printf("Your nickname was set to Anonymous!");
}
send_message(nickname);
}
}
答案 0 :(得分:3)
代码存在许多问题。我们一个一个地讨论它们。
首先,char
不足以容纳字符串,您需要
使用第一种方法,您需要更改
char option;
char nickname;
到
#define SIZ 64
char option[SIZ] = {0};
char nicknamep[SIZ] = {0};
然后,您应该使用fgets()
而不是使用gets()
来避免缓冲区溢出的可能性。像
fgets(option, SIZ, stdin);
会做。
也就是说,一旦option
成为数组,就无法指定。您需要使用strcpy()
将内容复制到数组中。例如,
strcpy(nickname, "Anonymous");
答案 1 :(得分:1)
没有为字符串分配内存。
你需要这样的东西:
char option[50];
char nickname[50];
并在此处使用strcpy()
:
nickname = "Anonymous";
并以strlen()
为例检查字符串。
if(!nickname){
使用fgets()和length参数来防止缓冲区溢出也更安全。
while (gets(option)) {
答案 2 :(得分:0)
option
必须为char[???]
不确定昵称,但也需要分配内存和/或初始化。你怎么设置它?你用什么价值?
您还需要检查strlen(nickname)>0
而不是!nickname
,它将测试空指针,而不是空字符串。
答案 3 :(得分:0)
从不曾使用gets
;它无法正确使用。相反,请使用fgets
,stdin
作为第三个参数。
您会注意到fgets
将要分配的存储空间的长度作为其第二个参数。 gets
函数中缺少此参数是无法正确使用的原因。您应该在您的情况下将值传递给它1,并将其传递给char
变量的地址。然后,fgets
会将一个字符读入您的变量。
如果您想了解更多内容,首先需要为您要阅读的数据分配更多存储空间。例如,您可以为80个字符分配空间:
char string[80];
现在,您可以fgets
使用string
作为第一个字符,将80作为第二个字符,stdin
作为第三个字符。然后fgets
将从stdin
读取最多80个字符。
如果您不想将该号码存储在源代码中的两个位置,则可以使用sizeof
运算符,或使用宏来预定义缓冲区的大小。