【问题标题】:C - fgets doesnt wait for input when initializing pointerC-初始化指针时fgets不等待输入
【发布时间】:2018-04-01 06:44:04
【问题描述】:

我正在制作非常基本的程序来检查 fputs 和 fgets 的工作方式,并且发生了一些奇怪的事情。以下代码工作正常:

#include <stdio.h>
#include <stdlib.h>

int main () {

    char* word;
    char* a;
    int k = 3;

    fgets(word, k, stdin);
    fputs(word, stdout);

    free(word);

    return 0;
}

“很好”是指程序等待输入,然后打印该输入(最多 2 位数字 - 因为我假设最后一个是 '\0' -)所以没关系。 char* a 是未使用的,我知道。

让我觉得奇怪的是,当我初始化 char* a = NULL 时,新代码是:

#include <stdio.h>
#include <stdlib.h>

int main () {

    char* word;
    char* a = NULL;
    int k = 3;

    fgets(word, k, stdin);
    fputs(word, stdout);

    free(word);

    return 0;
}

现在 fgets 不等待标准输入。我什至根本没有使用 char* a 所以我看不出这个初始化怎么会导致任何问题。谁能解释一下?欢迎对提交的代码提出任何其他更正/建议!

【问题讨论】:

  • 两种代码的行为都是未定义的行为。 char* word; --> char* word = malloc(3);

标签: c string pointers memory-management io


【解决方案1】:

您的代码在这两种情况下都会调用 Undefined Behavior,因为您试图将输入存储在一个不指向任何内存块的指针中!这解释了您观察到的不一致。


改变这个:

char* word;

到这里:

char* word = malloc(sizeof(char) * 3);

或者,更好的是,使用一个数组:char word[k];,或者使用一个常量(并且可能使用更大的行长——我建议4096,部分是为了冲击价值,但主要是因为它不会造成麻烦并且会避免麻烦)。

【讨论】:

  • 或者,更好的是,使用一个数组:char word[k];,或者使用一个常量(可能还有更大的行长——我建议使用 4096,部分是为了冲击价值,但主要是因为它不会造成麻烦,并会阻止麻烦)。
  • 谢谢!这回答了我的问题,但可以肯定的是......我认为 fgets 分配了指针“单词”所需的内存,现在从你的回答中我认为我不正确,必须在使用 fgets 之前分配内存,对吗?此外,没有办法像我尝试的那样使用“单词”的动态内存来解决这个问题,因为为了做到这一点,我必须先验地知道输入的长度是多少,但事实并非如此。对吗?
  • fgets() 不会为您分配任何空间,所以是的。好吧,如果您静态分配内存,您仍然需要“猜测”数组的大小,对吗?有一些方法可以解决这个问题,但这是一个新问题。 ;) 所以在这两种情况下都是。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
  • 2023-03-10
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
相关资源
最近更新 更多