首页 文章

读取用户输入时fgets分段错误

提问于
浏览
0

这是使用ubuntu的违规代码

char *name;

int main(void)
{
  fgets(name, sizeof(name), stdin);
}
void HUD()
{
  printf("%s ", name); 
}

这是我的问题 . 我开始使用scanf(“%s”,&name)并在字符串末尾收到垃圾邮件 . 在过去的2个小时里一直在阅读scanf和fgets上的文档,因为当你不知道所需数组的大小时,显然不应该使用scanf(并且由于用户输入的大小不同)我决定尝试使用fgets . 我也试过用char name [100]设置一个固定值;并通过fgets(name,100,stdin)

现在我得到了一个分段错误,通过阅读我在google的前两页找到的每个结果,我的语法看起来是正确的,我在cboard上找不到任何内容或在这里解决我的问题 .

有任何想法吗?

2 回答

  • 3

    sizeof(name) 将是系统上指针的大小,在我的系统上是8个字节 . 您可能一直期望的不是缓冲区的大小

    char* name 也未初始化 . 您将尝试写入未初始化的缓冲区,它将以未定义的行为结束 .

    要解决,请将其设置为固定大小的缓冲区或在堆上分配一些空间 .

    Allocate

    #include <stdio.h>
    #include <stdlib.h>
    
    #define NAME_SIZE 100
    char *name;
    
    void HUD()
    {
      printf("%s ", name); 
    }
    
    int main(void)
    {
        name=calloc(NAME_SIZE, sizeof(char));
        fgets(name, NAME_SIZE, stdin);
    
        HUD();
    
        free(name);
    }
    

    Static Array

    #include <stdio.h>
    #include <stdlib.h>
    
    #define NAME_SIZE 100
    char name[NAME_SIZE];
    
    void HUD()
    {
      printf("%s ", name); 
    }
    
    int main(void)
    {
        fgets(name, NAME_SIZE, stdin);
    
        HUD();
    }
    

    您必须将缓冲区的大小传递给 fgets ,以便知道它必须写入多少空间 .

  • -2

    char *fgets(char *restrict s, int n, FILE *restrict stream);

    fgets()函数必须从流中读取字节到s指向的数组,直到读取n-1个字节,或者读取a并将其传送到s,或者遇到文件结束条件 . 然后以空字节终止该字符串 . [0]

    您需要将其分配给特定大小并调用具有该大小的fgets . 这段代码可以帮助你完成同样的事情,但它有一个固定大小的缓冲区 .

    #include <stdlib.h>
    #include <stdio.h>
    
    char name;
    char* buffer;
    int buffer_size = 16;
    int i = 0;
    
    
    void HUD()
    {
            printf("%s ", buffer);
    }
    
    int main(void)
    {
            buffer = malloc(buffer_size);
            if(!buffer) return;
    
            for(;;) {
                    name = getchar();
                    if(name < 0) {
                            buffer[i] = '\0';
                            goto finish;
                    } else if(i < (buffer_size -1)) {
                            buffer[i++] = name;
                    } else if(name == '\n') {
                            break;
                    }
            }
            buffer[i] = '\0';
            finish:
                HUD();
                free(buffer);
                return 0;
    }
    

    [0] http://pubs.opengroup.org/onlinepubs/009695399/functions/fgets.html

相关问题