2009-11-14 73 views
1

該程序應該查找以「.exe」結尾的Unix上輸入的命令行參數。由於某種原因,它不起作用。這裏是代碼:在字符串C++的末尾比較字符

int main(int argc, char* argv[]) 
{ 
    for (int i = 1; i < argc; i++) 
    if(findExe(argv[i])) 
     cout << argv[i] << endl; 

    return 0; 
} 
bool findExe(char* argument) 
{ 
    if (strlen(argument) >= 4) 
    { 
     string testExe = ".exe"; 
     string initialWord=argument; //converts c-string to string 
     string temp(initialWord,(initialWord.size() - 4),4);//creates temp with last four characters from initialWord 

     if (!temp.compare(testExe)) 
     return true; 
    } 
    else 
    return false; 
} 

回答

6

刪除else,我認爲(雖然我沒有編譯代碼來檢查)。在長度至少爲4的情況下,但字符串比較返回非零值時,可以在不返回的情況下到達函數的結尾。您的編譯器應該警告過您:打開更多警告。

+0

作爲一個便箋,任何想法,爲什麼它只是一個警告,而不是一個錯誤? – Naveen 2009-11-14 17:42:06

+1

如果你使用的是gcc,試試像這樣編譯:g ++ -Wreturn-type ...來查看你的代碼的問題。 – 2009-11-14 17:45:58

+0

@Naveen:實際上,我沒有看過它是否是錯誤,只是假設沒有證明Pat的編譯器在這方面是兼容的。我的意思是「應該」,意思是「這是編譯器經常注意的事情」。假設編譯器不需要拒絕代碼,並且如果你正在尋找一個基本原理,那麼我會推測這是因爲發現這個錯誤需要少量的執行路徑分析,所以標準可能不希望強制要求。 – 2009-11-14 17:47:16

3

你的findExe函數有一個不返回結果的分支......就像Steve說的那樣,編譯器應該已經警告過你。

+0

是的,如果你使用的是gcc,試試像這樣編譯:g ++ -Wreturn-type ...來查看你的代碼的問題。 – 2009-11-14 17:44:03

0

這個怎麼樣?

bool findExe(char* argument) 
{ 
    int n = strlen(argument); 
    if (n < 4) return false; 
    char* ext = argument[n-4]; 
    if (strcmp(ext, ".exe") == 0) return true; 
    return false; 
}