我不确定为什么要为此得到输出?

时间:2019-05-28 03:51:12

标签: c++

我正在学习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

请有人解释这种行为。

2 个答案:

答案 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以及满足您其他需求的其他必需库。