簡體   English   中英

讓用戶在C中指定文件名

[英]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

讀取所有面向行的輸入函數(如fgetsgetline並在它們填充的緩沖區中包含結尾的'\\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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM