我不确定为什么我会为此获得输出?

I am not sure why I am getting output for this?

本文关键字:输出 不确定 为什么      更新时间:2023-10-16

我正在学习一些C++字符串处理,并且正在对代码进行命中和跟踪,令人惊讶的是得到了给定代码的输出。

#include<bits/stdc++.h>
using namespace std;
int main(){
char str[12]={'67','a','v','i'};
cout<<str;
return 0;
}

令人惊讶的是,我打印了 7avi .

但是如果我用"\68"替换"\67"。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

请有人解释这种行为。

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';

我认为您正在尝试使用八进制或十六进制输入 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>。它不是标准化的(有关更详细的解释,请参阅此处。而是包括用于cout<iostream>和满足您其他需求的其他必要库。