2015-02-23 62 views
0

我有以下的代碼從所述命令行讀取一個文件名,並且打開該文件:Ç分配串從的argv []到char數組

#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; 
} 

此示例的工作原理,但我想寫入字符串從命令行到字符數組,並通過該字符數組到fopen(),但我得到編譯器錯誤 Error: assignment to expression with array type filename = argv[1];

這個錯誤意味着什麼,我該怎麼做才能解決它?

+0

使用'的strcpy(文件名,ARGV [1]);' – 2015-02-23 18:19:58

+0

的可能重複[無法分配數組到另一個](http://stackoverflow.com/questions/10862550/cannot-assign-an-array-to-another) – 2015-02-23 18:26:24

+0

在「文件打開」消息的末尾添加\ n。圍繞此指令使用大括號以與else子句保持一致。 – chqrlie 2015-02-23 18:37:22

回答

5

您必須將字符串複製到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]); 
... 

你可能想輸出錯誤消息到stderr。 作爲一個側面說明,你可能想選擇英語或德語,但在同一時間不能同時使用;-)

+0

一個簡單的解決方法是隻保留'char * filename'中的指針'argv [1]'的副本。除非你自己修改它,*一個非常糟糕的想法*,它的內容在程序執行期間不會改變。 – chqrlie 2015-02-23 18:33:42