[英]I am not sure why I am getting output for this?
我正在學習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
請有人解釋此行為。
\\nnn
表示法,其中nnn是介於0到7之間的數字,用於八進制(以8為底)表示法。 因此,在\\68
,68不是有效的八進制數。 大於67的數字就是70。它解釋代碼的方式是,您將'\\ 6'設置為八進制的字符6,但隨后在字符文字中附加了一個'8'
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>
和滿足您其他需求的其他必需庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.