c - 我的 C 程序有什么问题?

标签 c linux file

Code link

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

#define OS_TYPE    "/proc/sys/kernel/ostype"
#define OS_RELEASE "/proc/sys/kernel/osrelease"
#define V_BUFF     30

static const char * get_value(const char * file_path)
{
        static char value[V_BUFF];
        FILE *fd;

        memset(value, 0, sizeof(value));

        if ((fd = fopen(file_path, "r")) == NULL) {
                fputs("Fopen function error.\n", stderr);
                exit(EXIT_FAILURE);
        }

        while (fgets(value, V_BUFF, fd) == NULL) {
                fputs( "Fscanf function error.\n", stderr);
                exit(EXIT_FAILURE);
        }

        fclose(fd);

        return value;
}

int main(void) {
        fprintf(stdout, "%s%s", get_value(OS_TYPE), get_value(OS_RELEASE));

        return EXIT_SUCCESS;
}

哪里错了? 为什么结果一样?

如果在while内或while外添加fflush,结果也是一样的。

请帮帮我,告诉我是什么原因。 谢谢!

最佳答案

对参数进行求值,然后将其传递给 fprintf 以对其进行格式化。

由于两个结果只有一个内存区域(static),因此最后一个函数调用“获胜”,并且您会得到两次相同的结果(请注意,计算顺序是实现定义的,因此您可以得到第一个结果的两倍,或第二个结果的两倍)

快速修复:按照 BLUEPIXY 的建议,您可以调用 fprintf 两次:

    fprintf(stdout, "%s", get_value(OS_TYPE));
    fprintf(stdout, "%s", get_value(OS_RELEASE));

要正确解决此问题,您必须使用 malloc (char *value = malloc(V_BUFF);) 分配内存,但在这种情况下,您需要存储指针以便能够释放它,或者将额外的参数传递给函数,作为内部使用的缓冲区,就像一些标准函数一样。

const char * get_value(const char * file_path, char *value)
{
    ...
    return value;
}

现在您可以使用单独的缓冲区在一行中进行调用,并且不会发生内存泄漏:

char vbuf[V_BUFF],obuf[V_BUFF];
fprintf(stdout, "%s%s", get_value(OS_TYPE,vbuf), get_value(OS_RELEASE,obuf));

关于c - 我的 C 程序有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47120259/

相关文章:

android - 如何在 android libgdx 上保存和读取整数?

c - fclose() 有什么意义?

c - 在 C 中从命令行参数打印子字符串

python - 将调色板颜色的 16x16 真彩色图像转换为实际的调色板文件

linux - 如何在 Windows 和 OS X 上的端口 80 上运行 Vagrant Apache

ruby - 将文件中的字节数据读入多个整数

file - 在 Go 中获取给定文件描述符的文件大小

c - 将程序集 'shl' 、 'OR' 、 'AND' 、 'SHR' 操作转换为 C 的引用?

c - C 中的 open() 和 write() 函数

c - 自定义排序函数的奇怪结果