我正在学习C ++中的一些字符串处理方法,并且在代码上进行了命中和跟踪,并出人意料地获得了给定代码的输出。
#include<bits/stdc++.h>
using namespace std;
int main(){
char str[12]={'\67','a','v','i'};
cout<<str;
return 0;
}
令人惊讶的是我打印了7avi。
但是如果我将'\ 67'替换为'\ 68'。在Repl.it(https://repl.it/languages/cpp)
上显示以下错误#include<bits/stdc++.h>
using namespace std;
int main(){
char str[12]={'\68','a','v','i'};
cout<<str;
return 0;
}
main.cpp:6:19: warning: multi-character character constant [-Wmultichar]
char str[12]={'\68','a','v','i'};
^
main.cpp:6:19: error: constant expression evaluates to 1592 which cannot
be narrowed to type 'char' [-Wc++11-narrowing]
char str[12]={'\68','a','v','i'};
^~~~~
main.cpp:6:19: note: insert an explicit cast to silence this issue
char str[12]={'\68','a','v','i'};
^~~~~
static_cast<char>( )
main.cpp:6:19: warning: implicit conversion from 'int' to 'char' changes
value from 1592 to 56 [-Wconstant-conversion]
char str[12]={'\68','a','v','i'};
~^~~~~
2 warnings and 1 error generated.
compiler exit status 1
请有人解释这种行为。
答案 0 :(得分:5)
\nnn
表示法,其中nnn是介于0和7之间的数字,用于八进制(以8为底)表示法。因此,在\68
中,68不是有效的八进制数。大于67的数字是70。它解释代码的方式是,您将'\ 6'设置为八进制字符6,但随后在字符文字中附加了一个'8'
ASCII字符-因此是一个多字符常量,不能存储在char
变量中。您可以将其存储为“宽字符”:
wchar_t str[12]={'\68','a','v','i'};
但是,没有operator<<
重载来显示wchar_t
的数组,因此您的cout << str
行将与void*
重载相匹配,只显示该行的内存地址。数组中的第一个元素,而不是任何字符本身。
您可以使用以下方法解决此问题:
wcout << str;
另外,我建议也将换行符放在输出之后。没有它,您的输出可能会被控制台提示符覆盖,然后才能看到它,尽管您正在使用的在线REPL不会发生这种情况。看起来应该像这样:
wcout << str << '\n';
答案 1 :(得分:0)
我认为您正在尝试使用八进制或十六进制键入ASCII字符(八进制通常以0
开头,而十六进制以0x
开头)。只是不要将ASCII代码放在引号中,而是将代码直接放入数组中,如下所示:
char str[12] = {68, 'a', 'v', 'i'}; //decimal
char str[12] = {0x44, 'a', 'v', 'i'}; //hex
char str[12] = {0104, 'a', 'v', 'i'}; //octal
请不要使用<bits/stdc++.h>
。它不是标准化的(有关详细说明,请参见here。)请为<iostream>
包括cout
以及满足您其他需求的其他必需库。