在C语言中,字符串与其他高级语言不同;也就是说,你必须手动分配所需的内存空间。在使用c-string函数时,需要确保已为结果字符串分配了足够的内存,通过在堆栈上预留足够的空间(即char filename [HOPEFULLY_ENOUGH])或通过堆(malloc()等)实现。您不能指望getenv返回一个足够的空间供您连接的字符串;以下是一个完整的程序,从头到尾完成您想要做的事情(除了一些啰嗦的错误检查):
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
char *filename = "/dataNumbers.txt";
char *writeString = "TEST";
char *home_dir = getenv("HOME");
char *filepath = malloc(strlen(home_dir) + strlen(filename) + 1);
strncpy(filepath, home_dir, strlen(home_dir) + 1);
strncat(filepath, filename, strlen(filename) + 1);
printf("%s\n", filepath);
FILE *myFile = fopen(filepath, "w");
fwrite(writeString, 1, strlen(writeString), myFile);
fclose(myFile);
free(filepath);
return 0;
}
strncpy将复制字符串和空终止符(这就是+1
的原因)。strncat将从空终止符处开始连接,结果连接的字符串本身必须以空终止符结尾(因此在strncat的第三个参数中使用+1
)。
我使用malloc和free是因为很难精确知道文件完整路径的长度。你可以选择一个巨大的数组(如char[4096]),但这似乎很浪费,不是吗? malloc()允许您准确地保留所需的内存量。既不多,也不少。
您还可以使用snprintf函数进行字符串连接。我仅包含此内容供您个人丰富知识,有时拥有多种执行相同操作的方法很好,即使strcpy和strcat会使您的意图更清晰地传达给代码读者:
char *filename = "/dataNumbers.txt";
char *writeString = "TEST";
char *home_dir = getenv("HOME");
size_t size = strlen(home_dir) + strlen(filename) + 1;
char *filepath = malloc(size);
snprintf(filepath, size, "%s%s", home_dir, filename);
希望这能帮到你!
file
变量的值是什么?它是否是预期的文件名?$HOME
的权限?你可能认为这应该是安全的假设,但你仍然应该双重检查该目录的权限。fwrite()
。这里明显缺乏错误检查。你需要测试myFile
是否为 null,并在发现时调用perror()
或其相关函数,而不是继续像没有问题一样进行。 - user207421