当我被赋予"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;
}
*修订版 - 好的,所以我将双撇号更正为单撇号,但代码总是中止我。
答案 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'