2010-06-14 55 views
0

當我得到"d""\"/""b"時,需要打印出字符的語句字符。 (d,b,斜槓,反斜槓和5引號)。現在顯示的唯一錯誤是行if(i.at(j)="\\")else if(i.at(j)="\"")。另外,如何排除外部雙撇號?打印轉義字符

#include <iostream> 
#include <cstdlib> 
using namespace std; 

int main (int argc, const char* argv[]) 
{ 
    string i= argv[1]; 
    for (int j=0; j>=sizeof(i)-1; j++) 
    { 
     if(i.at(j)=='\\') 
     { 
     cout << '\\'; 
     } 
     else if(i.at(j)=='\"') 
     { 
     cout << '\"'; 
     } 
     else 
     { 
     cout << i.at(j); 
     } 
    } 
    return 0; 
} 

*修訂 - 確定,所以我糾正了雙撇號單撇號,但代碼總是中止我。

+0

你是什麼意思「外部雙撇號被排除?」 – 2010-06-14 22:34:28

+0

if(i.at(j)=「\\」) - 你知道你在做任務嗎?使用== – Serapth 2010-06-14 22:35:23

+0

它只能打印5個雙撇號而不是7個 – danutenshu 2010-06-14 22:46:55

回答

1

你已經欺騙了你的平等測試(==,而不是=)。

另外,從索引1開始,直到比字符串的長度少1(按索引減少2)。

+0

你是什麼意思索引1.你能進一步解釋嗎? – danutenshu 2010-06-14 22:39:25

+0

開始報價位於字符串的索引0處。 – 2010-06-14 22:54:35

+0

好吧我已經糾正如上所示,但如果我添加行'cout << sizeof(i);'它輸出4無論我輸入提示 – danutenshu 2010-06-14 22:58:10

2

std::string::at()返回char,不是std::string,所以你需要使用字符文字(單引號分隔,'),不是字符串(用雙引號分隔,")。例如,

i.at(j) == '\\' 

還請注意,您正在使用分配=),並且在if語句不相等比較==)(這是一種常見的,惡性的錯誤)。

+0

即使我更正了代碼,代碼也會中止。我編輯了這篇文章;你能再幫我一次嗎? – danutenshu 2010-06-14 22:53:17

1

您的for循環for (int j=0; j>=sizeof(i)-1; j++)不正確,原因有兩個。

首先,您需要在循環中進行小於或小於或等於的比較。正如現在寫的,j從零開始,不大於sizeof(i)-1。因此你的循環立即中止。

其次,sizeof(i)是不是你想要反正比較。該表達式給出了字符串對象的大小,而不是該對象包含的實際字符串的大小。你想i.size()

有了這些變化,你的循環將for (int j=0; j<=i.size()-1; j++)

1

你在做什麼是不必要的。轉義僅在您的代碼中的字符串文字中需要。如果按字符打印argv[1],則會按原樣獲取字符串。

std::cout << argv[1]; 

如果你沒有得到正確的結果,這意味着逃脫序列由外殼首先處理。你可以在很多shell中避免它。例如。在bash中,你必須用單引號傳遞你的論點:

bash$ ./program 'd""\"/""b'