在C ++中打印“\”字符

时间:2013-12-23 08:45:32

标签: c++

这个问题可能很愚蠢但如果我了解这种行为会很好。

我尝试打印

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

使用简单的程序

char testme [] ="\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\0";
cout<<"testme:"<<testme<<endl;

这种情况下的输出是

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

我打算打印64“\”字符,而输出是32“\”字符。

似乎有一些我缺少的东西,因为输出正好是一半。

编辑:我问的原因是因为,我必须^“\”另一个字符用于HMAC加密,我看到一些奇怪的事情。

8 个答案:

答案 0 :(得分:7)

在C ++ 11中你可以这样做......

char testme [] =R"(\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\0)";
cout<<"testme:"<<testme<<endl;

Raw Character Strings的R“(...)”... 要在字符串文字中表示反斜杠(),我们必须在其前面加上反斜杠。为防止错误(反斜杠太多),C ++提供了raw string literals ...

答案 1 :(得分:5)

这称为转义,是一种将某些字符插入字符串的机制。例如,如果要在字符串中插入引号,则需要将其转义。

char testme [] ="I am a so called \"programmer\".";

还有\n\t和其他代码。但是,这适用于\本身,因为您可能希望能够使用一个字符串\n而不将其转换为换行符。

char testme [] ="This is a backslash followed by the letter n: \\n";

答案 2 :(得分:4)

\\用于表示单个反斜杠:\。这是因为\在字符串文字中用于表示其他符号,例如\t表示标签,\n表示换行符,\"表示引号字符。

所以\\给你一个反斜杠,\\\\给你两个等等。

答案 3 :(得分:3)

要打印\标准,请说明

C11; 6.4.4.4字符常量:

  

双引号"和问号?可以自己或通过   转义序列分别为\"\?,但单引号'和反斜杠\   应分别由转义序列\'\\ 1 表示。

这意味着要打印\,您需要额外的反斜杠\。要打印两个\\,您需要四个反斜杠\\\\,因此对于64反斜杠,您需要128反斜杠。


<子> 1。重点是我的。

答案 4 :(得分:3)

\是一个称为Escape Character的特殊字符。对于ex :: \n表示newline character。因此,如果您要打印single \,则必须提供\\。第一个\表示编译器不将下一个\视为转义字符。

答案 5 :(得分:3)

如果是C ++,为什么不使用string:

string testme(64, '\\');
cout << testme << endl;

答案 6 :(得分:2)

反斜杠\是一个非常普遍的转义字符,C ++也使用它。这意味着它用于表达特殊含义(通常是不可打印的字符)。例如,要将换行符(ASCII 10)编码为字符串,请在字符串文字中将其表示为\n。另一个例子,在一行的末尾放置一个反斜杠(也就是说,在行的终止换行符之前)转义换行符 - 这样,你可以在几个源上继续宏定义或// - 样式的注释文件行,它们仍然算作一条逻辑行。

这当然意味着要获得字面反斜杠字符,您必须转义反斜杠本身,以删除其“转义字符”状态。因此,在字符串文字中输入\\会产生一个文字\字符。

这就是为什么你只得到一半的反斜杠输出--C ++源代码解析器消耗两个来生成一个。

答案 7 :(得分:2)

你没注意到一件事:

你打印了64 '\',但它只打印了32张。

你尝试过60,或54,还是一些奇怪的组合。说33?

在C中,'\'是转义字符。您应该使用'\n'表示换行,然后您才注意到'\'未打印。

要打印'\',您必须使用'\\'

给你一个问题:

尝试打印64 '%'。看看你得到了什么。尝试了解输出的原因。