我的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));