Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的C语言程序有什么问题?_C_Linux_File - Fatal编程技术网

我的C语言程序有什么问题?

我的C语言程序有什么问题?,c,linux,file,C,Linux,File,#包括 #包括 #包括 #定义操作系统类型“/proc/sys/kernel/ostype” #定义操作系统发布“/proc/sys/kernel/osrelease” #定义V_BUFF 30 静态常量字符*获取值(常量字符*文件路径) { 静态字符值[V_BUFF]; 文件*fd; memset(值,0,sizeof(值)); if((fd=fopen(文件路径,“r”))==NULL){ fputs(“Fopen函数错误。\n”,stderr); 退出(退出失败); } while(fge

#包括
#包括
#包括
#定义操作系统类型“/proc/sys/kernel/ostype”
#定义操作系统发布“/proc/sys/kernel/osrelease”
#定义V_BUFF 30
静态常量字符*获取值(常量字符*文件路径)
{
静态字符值[V_BUFF];
文件*fd;
memset(值,0,sizeof(值));
if((fd=fopen(文件路径,“r”))==NULL){
fputs(“Fopen函数错误。\n”,stderr);
退出(退出失败);
}
while(fgets(值,V_BUFF,fd)=NULL){
fputs(“Fscanf函数错误。\n”,stderr);
退出(退出失败);
}
fclose(fd);
返回值;
}
内部主(空){
fprintf(标准输出,“%s%s”、获取值(操作系统类型)、获取值(操作系统发布));
返回退出成功;
}
哪里不对? 为什么结果是一样的

如果在
while
中或在
while
中添加
fflush
,则结果也相同

请帮帮我,告诉我原因。
谢谢

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

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

快速修复:正如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));

请张贴你的密码;不是它的链接。:)将其分成两个
fprintf
s.
while(fgets(value,V_BUFF,fd)==NULL)
suspect@BLUEPIXY出于某种原因,我需要把它放在一个单子里。@GOLDEN_gun不可能同时将同一个内存用于不同的目的。我可以挑剔。这个问题是基本的,我们不要写假的东西。谢谢你的回答。如果它解决了你的问题,请考虑接受答案。
char vbuf[V_BUFF],obuf[V_BUFF];
fprintf(stdout, "%s%s", get_value(OS_TYPE,vbuf), get_value(OS_RELEASE,obuf));