当将变量传递给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/

10-16 00:39