打印逃脱字符

时间:2010-06-14 22:31:19

标签: c++ escaping

当我被赋予"d""\"/""b"时,我需要打印出字符的语句字符。 C ++中的(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;
 }

*修订版 - 好的,所以我将双撇号更正为单撇号,但代码总是中止我。

4 个答案:

答案 0 :(得分:2)

std::string::at()返回char,而不是std::string,因此您需要使用字符文字(由单引号分隔,'),而不是字符串文字(由分隔符双引号,")。如,

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

另请注意,您在=语句中使用赋值==)而不是相等比较if) (这是一个常见的,有害的错误)。

答案 1 :(得分:1)

您已经完成了平等测试(==,而不是=)。

此外,从索引1开始,直到比字符串的长度少1(比索引少2)。

答案 2 :(得分: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++)

答案 3 :(得分:1)

你在做什么是不必要的。只需在代码中的字符串文字中进行转义。如果逐个字符地打印argv[1],您将按原样获得字符串。

std::cout << argv[1];

如果没有得到正确的结果,这意味着转义序列首先由shell 处理。你可以在很多shell中避免它。例如。在bash中你必须用单引号传递你的参数:

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