将变量传递给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
?我做错了什么或这是一个已知的错误(我没有在网上找到任何东西,手册页没有提到它?)
答案 0 :(得分:6)
您需要使用strlen(getenv("HOME"))
,而不是sizeof(getenv("HOME"))
。 getenv
返回一个指针,而不是一个数组(它不可能在C中返回一个数组),所以sizeof
返回指针的大小,这可能只是4
。
此外,您需要为所有字符串所具有的尾随0
字节留出空间。如果您要附加8个字符的字符串,例如"/.bashrc"
,则需要在分配9
时将path
添加到主目录的长度。所以它应该是:
char path [ strlen ( getenv ("HOME") ) + 9];