簡體   English   中英

C 將 argv[] 中的字符串分配給 char 數組

[英]C assign string from argv[] to char array

我有以下代碼,它從命令行讀取文件名並打開該文件:

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv){
    FILE *datei;
    char filename[255];

    //filename = argv[1];
    //datei=fopen(filename, "r");
    datei=fopen(argv[1], "r");
    if(datei != NULL)
        printf("File opened");
    else{
        printf("Fehler beim öffnen von %s\n", filename);
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;
}

此示例有效,但我想將命令行中的字符串寫入 char 數組並將該 char 數組傳遞給 fopen(),但我收到編譯器錯誤Error: assignment to expression with array type filename = argv[1];

此錯誤是什么意思,我該如何解決?

您必須將字符串復制到 char 數組中,這不能通過簡單的賦值來完成。

簡單的答案是strcpy(filename, argv[1]); .

這種方法有一個很大的問題:命令行參數可能比filename數組長,導致緩沖區溢出。

因此正確答案是:

if (argc < 2) {
    printf("missing filename\n");
    exit(1);
}
if (strlen(argv[1]) >= sizeof(filename)) {
    printf("filename too long: %s\n", argv[1]);
    exit(1);
}
strcpy(filename, argv[1]);
...

您可能希望將錯誤消息 output 發送到 stderr。 作為旁注,您可能想選擇英語或德語,但不要同時使用兩者;-)

一個更簡單的解決方案是只在char *filename中保留指針argv[1]的副本。 除非你自己修改它,這是一個非常糟糕的主意,它的內容在程序執行期間不會改變。

這是修改后的版本:

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
    FILE *datei;
    char *filename;

    if (argc < 2) {
        fprintf(stderr, "Fehlendes Dateiname-Befehlszeilenargument\n");
        return EXIT_FAILURE;
    }
    filename = argv[1];
    datei = fopen(filename, "r");
    if (datei != NULL) {
        printf("Datei erfolgreich geöffnet\n");
    } else {
        fprintf(stderr, "Fehler beim öffnen von %s: %s\n",
                filename, strerror(errno));
        return EXIT_FAILURE;
    }
    // ...
    fclose(datei);
    return EXIT_SUCCESS;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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