[英]Let the user specify a file name in C
這是我的代碼:
char filename[30];
FILE *fp;
printf(" Enter the filename: ");
gets(filename);
strcat(filename,".txt");
fp=fopen("e:\\filename","a+");
所以我的問題是我希望用戶指定一個文件名,然后打開該文件並在上面寫。 但是每次我運行此代碼時,它都會打開一個名為:filename的文件,而不是打開字符串filename [30]中存在的值。
您正在“在地雷上跳舞”並通過連接文本而不調用strcat
之前檢查filename
是否有足夠的字符來調情未定義行為 。 如果用戶輸入26個字符(或更多)的filename
怎么辦? (提示:未定義的行為)
您正在使用gets
作為輸入的事實使情況更加復雜。 gets
非常不安全,並且容易被緩沖區溢出利用,因此已在C11中將其完全刪除。 如果您的教授建議使用gets
請去找另一位教授。 請參閱: 為什么gets()如此危險,因此永遠不應該使用它!
而是使用fgets
或POSIX getline
來讀取filename
,同時保護您的數組邊界與fgets
或根據需要動態分配盡可能多的存儲filename
中的情況下, getline
。
讀取所有面向行的輸入函數(如fgets
和getline
並在它們填充的緩沖區中包含結尾的'\\n'
。 您只需要從字符串末尾修整'\\n'
。 您可以通過使用strlen
獲取長度並設置buffer[strlen(buffer) - 1] = '\\0';
或使用strcspn
函數在一個調用中提供更多功能。
綜上所述,您可以執行類似以下操作(僅輸出fopen
調用而不是實際打開文件):
#include <stdio.h>
#include <string.h>
#define MAXC 30 /* if you need a constant, #define one (or more) */
#define FEXT ".txt" /* (including string constants) */
int main (void) {
char filename[MAXC];
size_t available = MAXC - 1, /* chars available in filename */
length = 0,
extlen = strlen (FEXT);
FILE *fp;
fputs (" Enter the filename: ", stdout); /* no conversion needed */
if (!fgets (filename, MAXC, stdin)) {
fputs ("(user canceled input)\n", stderr);
return 1;
}
/* trim '\n' from end of filename saving length using strcspn() */
filename[(length = strcspn (filename, "\r\n"))] = 0;
if (available - length < extlen) {
fprintf (stderr, "error: insufficient space available for '%s'.\n",
FEXT);
return 1;
}
strcat (filename, FEXT);
/* just output what would be done */
printf ("fp = fopen (\"e:\\%s\",\"a+\");\n", filename);
}
使用/輸出示例
該示例僅打印將打開的內容(而不是實際打開文件),例如
$ ./bin/strcatext
Enter the filename: my_file_to_open
fp = fopen ("e:\my_file_to_open.txt","a+");
然后檢查您的代碼是否接受25個字符的文件名和4個字符的擴展名,例如
$ ./bin/strcatext
Enter the filename: 1234567890123456789012345
fp = fopen ("e:\1234567890123456789012345.txt","a+");
並拒絕一個26個字符的文件名,例如
$ ./bin/strcatext
Enter the filename: 12345678901234567890123456
error: insufficient space available for '.txt'.
仔細檢查一下,如果您還有其他問題,請告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.