c/c++语言开发共享读取用户输入时fgets分段错误

这是使用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上找不到任何内容或在这里解决我的问题。

有任何想法吗?

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

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

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

    分配

     #include  #include  #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); } 

    静态数组

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

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

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

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

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

     #include  #include  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] = ''; goto finish; } else if(i < (buffer_size -1)) { buffer[i++] = name; } else if(name == 'n') { break; } } buffer[i] = ''; finish: HUD(); free(buffer); return 0; } 

    [0]

      以上就是c/c++开发分享读取用户输入时fgets分段错误相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/546001.html

      (0)
      上一篇 2021年1月10日
      下一篇 2021年1月10日

      精彩推荐