像C中的字符串是而不是像其他高級語言中的字符串一樣;也就是說,您必須自己爲它們分配所有空間。使用c-string函數時,需要確保爲結果字符串分配足夠的內存,方法是在堆棧上保留足夠的空間(即char filename [HOPEFULLY_ENOUGH])或通過堆(malloc()和friends)。你不能指望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的會令你的意圖更清楚你的代碼的讀者:
希望這幫助!
來源
2016-02-03 04:01:10
bpm
1.文件變量的值是多少?它是預期的文件名嗎? 2.運行此代碼的用戶是否有權寫入'$ HOME'?你會認爲這應該是安全的,但你應該再次檢查該目錄的權限。 –
如果它不創建文件,你也不應該調用'fwrite()'。這裏明顯缺少錯誤檢查。你需要測試'myFile'爲null,如果找到,則調用'perror()'或它的朋友,而不是繼續進行。 – EJP