C++ “印刷”\&引用;C+中的字符+;

C++ “印刷”\&引用;C+中的字符+;,c++,C++,这个问题可能很傻,但如果我能理解它的行为,那就太好了 我试着打印 目前,来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自

这个问题可能很傻,但如果我能理解它的行为,那就太好了

我试着打印

目前,来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自\\\\

使用简单的程序

char testme [] ="\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\0";
cout<<"testme:"<<testme<<endl;
我打算打印64个“\”字符,而不是输出32个“\”字符

似乎有一些东西我错过了,因为输出正好是一半


编辑:我问这个问题的原因是,我必须对另一个字符进行HMAC加密,我看到了一些奇怪的事情。
\
用于表示单个反斜杠:
\
。这是因为
\
在字符串文字中用于表示其他符号,如选项卡的
\t
\n
表示换行符,
\“
表示引号字符


因此,
\\
给你一个反斜杠,
\\\\
给你两个反斜杠,依此类推。

这叫做转义,是一种将某些字符插入字符串的机制。例如,如果你想在字符串中插入引用标记,你需要转义它

char testme [] ="I am a so called \"programmer\".";
还有
\n
\t
和其他代码。但是,这适用于
\
本身,因为您可能希望能够有一个表示
\n
的字符串,而不将其转换为换行符

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

要打印
\
标准,请声明

C11;6.4.4.4字符常数: 双引号
和问号
可以由它们自己或由 转义序列分别为
\“
\?
,但单引号
和反斜杠
\
应分别用转义序列
\'
\
1表示

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



1。强调是我的。

< P>反斜杠<代码> \/C>是一个非常普遍的转义字符,C++也使用它。这意味着它用来表示特殊意义(通常是不可打印字符)。例如,对一个行进字符(ASCII 10)进行编码。在字符串中,您可以将其表示为字符串文字中的
\n
。另一个示例是,在行尾(即行尾换行符之前)添加一个反斜杠转义换行符-这样,您可以跨多个源文件行继续宏定义或
/
-样式的注释,它们仍将计为一个逻辑行

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


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

< P>你没有注意到一件事:

您打印了64个
'\'
,但它只打印了其中32个

你有没有试过60岁,54岁,或者一些奇怪的组合,比如说33岁

在C语言中,
'\'
是转义字符。你应该在换行符中使用
'\n'
,你当时没有注意到,
'\'
没有被打印出来吗

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

我想问你一个问题:


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

\
是一个特殊的字符,称为。例如:
\n
意味着
换行符
。因此,如果你想打印
单个\
,你必须给出
\
。第一个
\
表示编译器没有将下一个
\
视为转义字符。

在C++11中,您可以这样做

char testme [] =R"(\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\0)";
cout<<"testme:"<<testme<<endl;
目前,码>码>字符测试码码>字符测试测试码[[3]码码>字符字符测试码[[[码>码>码>码码>码>码码码>码码>码码码>码码码码码>>>码码码码码码码>>>>码码>码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码码[[[[[10 10 10 10 10 10 10 10 10 10 10[[[[[[[来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自来自""0",;
CUT< P>如果是C++,为什么不使用String:

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

打印出一个\,\应该逃跑:“这不是C。它是C++。你的直觉告诉你要加倍吗?(你得到32而不是64…)@Maroun Maroun是的,我的直觉告诉我这一点。我想知道为什么。反斜杠是转义字符。因此,它不会被打印出来,而是以一种特殊方式解释下一个字符的信号。因此,要打印一个反斜杠,你必须反斜杠,如果这有意义的话。换句话说,如果你想打印一个back slash您必须有两个连续的back slash.tx才能快速回答。回答您的问题我得到64“%”@samairtimer:尝试在不首先存储在数组中的情况下打印。我的意思是
printf(%%%…”);
转义序列与打印无关,要打印a\,只需输出a(单个)·转义序列只存在于字符串和字符文字中(输出64 1),我可能会做一些类似于<>代码> STD::CUTH.JAMESKANZE的问题。我的答案是C。C标签在我的回答之后被删除了。C和C++在这方面是相同的。输出时反斜杠没有什么特别之处,它是输出(打印)的。与大多数其他字符完全相同。(至少在输出为文本时,
'\n'
被视为特殊字符。)反斜杠在源代码中是特殊的,并且仅在源代码中;在他的例子中,是字符串文字。他没有打印64个反斜杠,因为他创建了一个只有32个反斜杠的字符串文字。现在我想起来了:C在
printf
中有一个转义字符,等等。
%
,这表明接下来发生了什么s的解释是不同的。因此,
printf(“%%”
只打印一个
%
,即使字符串中有两个。@JamesKanze;如果它与它无关,你怎么能
string testme(64, '\\');
cout << testme << endl;