c - 如何在 C 中返回 ReadLine() 函数?

标签 c string function readline

我有点卡在这里...当使用这个 conReadLine() 函数两次时,它返回与我之前读取的第二个字符串相同的地址。例如,如果它要求输入两次名称,并且我输入“NameA”和“NameB”,则存储的结果是“NameB”和“NameB”。我明白为什么会发生这种情况,但我不知道如何解决。将“buffer”声明为静态会起到同样的作用。我怎样才能让这个函数在每个字符串上返回一个单独的地址?

const char *conReadLine(void)
{   
    char buffer[MAX_BUFFER];

    fgets(buffer, MAX_BUFFER, stdin);

    // Check for newline character.
    char *newline = strchr(buffer, '\n');
    if (newline)
        *newline = '\0';  

    return buffer;
}

最佳答案

这样做:

const char *conReadLine(void)
{   
    char buffer[MAX_BUFFER];
    // something
    return buffer;
}

返回一个指向已释放堆栈的指针,这是非常糟糕的。它还会带来不可预测的结果,包括与其他调用甚至其他函数一起重用相同的地址!

您需要这样做:

const char *conReadLine(void)
{   
    char *buffer = (char*)malloc(MAX_BUFFER);
    // something
    return buffer;
}

每次都会给你一个新的内存位置。只需记住在使用完毕后释放它即可。

关于c - 如何在 C 中返回 ReadLine() 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7128972/

相关文章:

c - 定义 ARM MCU 内存边界

python - 创建 `n` 子串的详尽列表

c++ - 在 C++ 中将 utf8 wstring 转换为 windows 上的字符串

c++ - 阶乘不适用于所有值

java - 如何将图像按钮作为参数传递给 android studio 中的函数?

c++ - 用于列出正在运行的进程的 Linux API? - 有论点

c - 迭代分而治之

c - 我无法在C中获取数组长度

c# - 为什么我们在尝试用另一个字符串替换它时将 @ 与 "\"一起使用

c++ - 为什么数组中存储了额外的数据?