在将变量传递给 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"
,则需要在分配 path 时将
。所以应该是:9
添加到主目录的长度
char path [ strlen ( getenv ("HOME") ) + 9];
关于c - fopen() 破坏路径参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25374507/