C 中的字符串与其他高级语言中的其他字符串不同;也就是说,您必须自己为它们分配所有空间。使用 c-string 函数时,您需要确保为结果字符串分配了足够的内存,方法是在堆栈上保留足够的空间(即 char 文件名 [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 将在 null 终止符处开始串联,并且结果串联字符串本身必须以 null 终止(因此 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);
希望这会有所帮助!