gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:53:39 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com