2016-12-09 67 views
0

我想讀取一個文件並計算這些文字。我希望它能夠設置,以便我可以使用命令行,或者如果在命令行中沒有輸入文件,可以觸發if語句來獲取文件名並讀取它,然後對這些單詞進行計數。如果我在命令行中輸入文件名,它會起作用,但如果我不使用它,它會發生故障。下面是代碼:爲什麼我在if語句中遇到seg錯誤?

int main(int argc, char **argv) 
{ 
    char file[75]; 
    if (argc < 2) 
    { 
     cout << "Please enter the filename: "; 
     cin >> file; 
     strcpy(argv[1], file); 
    } 
    string content; 
    ifstream inFile(argv[1]); 
    int count = 0; 
    while (inFile >> content) 
     count++; 
    inFile.close(); 
    display(count, argv); 
    return 0; 
} 
+4

這是UB:'的strcpy(argv的[1],文件) ;' – drescherjm

+6

如果'argc'小於2那麼'argv'的有效索引是什麼? – NathanOliver

+0

您是否嘗試在分段出現故障後使用調試程序闖入代碼?那是什麼告訴你的?學習使用調試器是非常好的做法。即使你在這裏得到答案之後,你也應該嘗試一下,以確保你看到你將來如何爲自己弄明白這一點。 –

回答

1

如果條件爲真即如果argc確實小於2,則在一般情況下argc等於1,並根據C標準argv[argc]等於NULL

所以在這種情況下程序有未定義的行爲。

在任何情況下,將字符串複製到argv [n](其中n是某個索引)是個壞主意,因爲源字符串可能大於目標字符串。

您可以使用相反的方法將argv[1]複製到file

3

您不應該修改argv的數據,特別是越界。您邏輯應該工作正好相反:

char file[75]; 
    if (argc < 2) 
    { 
     cout << "Please enter the filename: "; 
     cin >> file; 
    } else 
     strcpy(file, argv[1]); 
    string content; 
    ifstream inFile(file); 

但你最好使用std::string可變file爲好。

而且cin >>僅輸入字(不包括空格符號),但文件名可以讓他們,讓你更好的使用cin.getline(file)std::getline(cin, file)如果你改變filestd::string

+0

修好了!謝謝!! – Ryu

相關問題