在用户输入字符串

时间:2016-01-13 13:19:35

标签: c arrays string segmentation-fault

您好我是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);
        }
    }

4 个答案:

答案 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;它无法正确使用。相反,请使用fgetsstdin作为第三个参数。

您会注意到fgets将要分配的存储空间的长度作为其第二个参数。 gets函数中缺少此参数是无法正确使用的原因。您应该在您的情况下将值传递给它1,并将其传递给char变量的地址。然后,fgets会将一个字符读入您的变量。

如果您想了解更多内容,首先需要为您要阅读的数据分配更多存储空间。例如,您可以为80个字符分配空间:

char string[80];

现在,您可以fgets使用string作为第一个字符,将80作为第二个字符,stdin作为第三个字符。然后fgets将从stdin读取最多80个字符。

如果您不想将该号码存储在源代码中的两个位置,则可以使用sizeof运算符,或使用宏来预定义缓冲区的大小。

相关问题