当将变量传递给fopen()
而不是字符串文本时,我遇到了一个奇怪的错误。下面是一段令人不快的代码:
FILE *rc;
...
rc = fopen ( path, "a" );
path
的定义如下:char path [ sizeof ( getenv ("HOME") ) + 8]; /* 8 is the length of "/.bashrc" and "/.tcshrc" which are the .*rc files with the longest names */
strcpy ( path, getenv ("HOME") );
...
if ( <check for shell> ) {
strcat ( path, "/.*rc" );
}
以下是调用
fopen()
之前的输出:${HOME}/.*rc (for example /home/user/.bashrc)
之后:
"$HOME" + square + \t + "rc"
... 发挥你的想象力。
为什么
fopen()
正在改变path
?我是做错了什么,还是这是一个已知的错误(我没有在网上找到任何东西,手册页没有提到它?) 最佳答案
您需要使用strlen(getenv("HOME"))
,而不是sizeof(getenv("HOME"))
。getenv
返回的是指针,而不是数组(在C中不可能返回数组),因此sizeof
返回的是指针的大小,可能只是4
。
此外,还需要为所有字符串的尾部0
字节留出空间。如果要追加8个字符串,如"/.bashrc"
,则在分配9
时需要将path
添加到主目录的长度。所以应该是:
char path [ strlen ( getenv ("HOME") ) + 9];
关于c - fopen()破坏path参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25374507/