2010-05-28 572 views
9
#include <stdlib.h> 
#include <stdio.h> 
#include <iostream> 
#include <string.h> 
using namespace std; 
int main() 
{ 
     string cmd; 
     while(strcmp(cmd.c_str(),"exit")==0 && strcmp(cmd.c_str(),"\exit")==0) 
     { 
       cin>>cmd; 
       cout<<cmd; 
     } 
     return 0; 
} 

我被卡住了。如何比較字符串與const char *?

+1

最好是直接將代碼中的問題 – 2010-05-28 18:55:02

+0

@布賴恩貼:我去這樣做。 – sbi 2010-05-28 18:55:44

+1

另外,如果使用cmd.compare(「exit」)而不是strcmp(cms,c_str(),「exit」),它會更乾淨== 0 您正在編寫C++代碼。爲什麼不利用它呢? – Vagrant 2010-05-28 19:04:33

回答

13

固定幾個小錯誤後,該作品在我的機器上:

#include <cstdlib> 
#include <cstdio> 
#include <iostream> 
#include <cstring> 
#include <string> 

int main() 
{ 
     std::string cmd; 
     while(std::strcmp(cmd.c_str(),"exit")!=0 
      && std::strcmp(cmd.c_str(),"\\exit")!=0) 
     { 
       std::cin>>cmd; 
       std::cout<<cmd << '\n'; 
     } 
     return 0; 
} 

不過,我不知道爲什麼要使用std::strcmp()可言。正如您剛剛發現的那樣,它不像std::string類那樣容易使用。這

while(cmd!="exit" && cmd!="\\exit") 

工作一樣好,更容易理解,從而更容易得到正確。

+0

OP可能希望在比較之前將輸入字符串轉換爲小寫字母。這允許用戶輸入「退出」以及「退出」。研究條款是:'std :: transform'和'tolower'。 – 2010-05-28 19:35:02

+0

Unixy上也有'strcasecmp'(也許是Windows)系統,它忽略了大小寫。 – Joe 2016-05-02 08:12:51

4

strcmp當它們相等時返回0。所以我想你想!= 0

當然strcmp不會返回0,因爲它不能等於兩者。

此外,它看起來像你在你的字符串的開始處有一個反斜槓,你應該用雙反斜槓來回避。

2

,因爲你正在測試檢查CMD字符串等"exit""\\exit"你而該條件將永遠不會計算到true。一個字符串不能同時等於兩個值。

11

可以使用!===運算符將std::string實例與字符串字面值直接進行比較。這使得你的比較更清晰。

注意\e不是有效的轉義字符,你需要,如果你的意思是一個文字\\\一倍。

while(cmd == "exit" && cmd == "\\exit") 

顯然cmd不能等於在同一時間兩個不同的字符串,想必你的意思!=

此外,請考慮std::getline(std::cin, cmd)是否比std::cin >> cmd;更合適。無論哪種情況,您都應該檢查讀取操作是否成功,否則如果流關閉或進入失敗狀態,您可能會以無限循環結束。

就我個人而言,如果您想要按照您的代碼回顯exit命令,我會採用類似的方式。

#include <string> 
#include <iostream> 
#include <ostream> 

int main() 
{ 
    std::string cmd; 
    while (std::getline(std::cin, cmd)) 
    { 
     std::cout << cmd << std::endl; 
     if (cmd == "exit" || cmd == "\\exit") 
      break; 
    } 
    return 0; 
} 
+0

這是正確的答案。 – 2015-09-03 00:13:45

0

你的問題是條件。

你可能希望做退出循環,當用戶進入退出,所以你應該使用:

while(strcmp(cmd.c_str(),"exit")!=0 && strcmp(cmd.c_str(),"\exit")!=0) 
0

只是幾件事情要記住,我重申一些的,是值得重複的建議而(1)次。

  1. 您正在使用C++,它是面向對象的,即它最好將數據和處理它的函數結合在一起。在這種情況下,使用字符串類而不是strcmp提供的字符串比較選項。

  2. 你的程序有一個邏輯錯誤,它會編譯,但我恐怕那不是你想要的。如果(a == x & & a == y)這將始終是錯誤的,因爲除非x = y,否則x和y都不能等於x,y,在您的情況下顯然x!= y。

乾杯, 帕