wchartc語言
① 請問以下c語言代碼每一句的意思
CString input; //聲明變數input 是CString 類型
m_Input.GetWindowTextW(input); // m_Input應當是已聲明過的對象,調成員函數獲取窗口標題文字
CString tmp; //聲明變數tmp 是CString 類型
YCodec yCodec; // 聲明yCodec 是 YCodec類型
// CString to wchar_t* //CString 到寬字元wchar_t 轉換
.int len = input.GetLength(); //獲取字元長度len
wchar_t* wchs = new wchar_t[len+1]; //動態分配 wchs 內存
memset(wchs, 0, sizeof(wchar_t)*(len+1)); // 給wchs清0
wcscpy(wchs, input.GetBuffer(len) ); // 復制 input中字元串到 wchs ,長度為len
// wchar_t* to hex string // 寬字元wchar_t 轉換 為16進制
int hexlen = 0; //16進制長度為int 型,初值給0
if(yCodec.Wchart2HexStr(wchs, len, 4, NULL, &hexlen) != -1){
//轉16進制,若返回不等於-1,則執行:
char* hexstr = new char[hexlen+1]; //動態分配hexstr增加1個字元
memset(hexstr, 0, hexlen+1); // hexstr清0
int n = yCodec.Wchart2HexStr(wchs, len, 4, hexstr, &hexlen); //調轉換函數,得返回值n
if(n != -1){ //若返回非 -1,即轉換成功
// char* to CString //轉為 CString 型
char* p = hexstr; //聲明和賦初值
for(int i=0; i<hexlen; i++) tmp.AppendChar(*p++); //向tmp尾巴上增添字元
}
. if(hexstr) delete []hexstr; //有條件 釋放內存
}
if(wchs) delete []wchs; //有條件 釋放內存
m_Disp.SetWindowTextW(tmp); // 顯示窗口標題名稱
② C 語言中是不是沒有wchart_t這個函數
沒有這個wchar類型
③ printf的%什麼意思
格式化字元串,是C、C++等程序設計語言printf類函數中用於指定輸出參數的格式與相對位置的字元串參數。其中的轉換說明(conversion specification)用於把隨後對應的0個或多個函數參數轉換為相應的格式輸出;格式化字元串中轉換說明以外的其它字元原樣輸出。
格式化字元串中的佔位符用於指明輸出的參數值如何格式化。
格式化佔位符(format placeholder),語法是:
%[parameter][flags][field width][.precision][length]type
Parameter可以忽略或者是:
n$ n是用這個格式說明符(specifier)顯示第幾個參數;這使得參數可以輸出多次,使用多個格式說明符,以不同的順序輸出。 如果任意一個佔位符使用了parameter,則其他所有佔位符必須也使用parameter。這是POSIX擴展,不屬於ISO C。例:printf("%2$d%2$#x;%1$d%1$#x",16,17)產生"17 0x11; 16 0x10"
Flags可為0個或多個:
+ 總是表示有符號數值的'+'或'-'號,預設情況是忽略正數的符號。僅適用於數值類型。
空格 使得有符號數的輸出如果沒有正負號或者輸出0個字元,則前綴1個空格。如果空格與'+'同時出現,則空格說明符被忽略。
- 左對齊。預設情況是右對齊。
# 對於'g'與'G',不刪除尾部0以表示精度。對於'f', 'F', 'e', 'E', 'g', 'G', 總是輸出小數點。對於'o', 'x', 'X', 在非0數值前分別輸出前綴0,0x, and0X表示數制。
0 如果width選項前綴以0,則在左側用0填充直至達到寬度要求。例如printf("%2d", 3)輸出"3",而printf("%02d", 3)輸出"03"。如果0與-均出現,則0被忽略,即左對齊依然用空格填充。
Field Width給出顯示數值的最小寬度,典型用於製表輸出時填充固定寬度的表目。實際輸出字元的個數不足域寬,則根據左對齊或右對齊進行填充。實際輸出字元的個數超過域寬並不引起數值截斷,而是顯示全部。寬度值的前導0被解釋為0填充標志,如上述;前導的負值被解釋為正值,負號解釋為左對齊標志。如果域寬值為*,則由對應的函數參數的值為當前域寬。
Precision通常指明輸出的最大長度,依賴於特定的格式化類型。對於整形數值,是指最小數字位數。對於a,A,e,E,f,F的浮點數值,是指小數點右邊的輸出值應該舍入的數字位數。對於g,G的浮點數值,是指有效數字最大位數。對於字元串類型,是指輸出的位元組的上限,超出限制的其它字元將被截斷。如果域寬為*,則由對應的函數參數的值為當前域寬。如果僅給出了小數點,則域寬為0。
Length指出浮點型參數或整型參數的長度。可以忽略,或者是下述:
字元
描述
hh 對於整數類型,printf期待一個從char提升的int尺寸的整型參數。
h 對於整數類型,printf期待一個從short提升的int尺寸的整型參數。
l 對於整數類型,printf期待一個long尺寸的整型參數。
對於浮點類型,printf期待一個double尺寸的整型參數。對於字元串s類型,printf期待一個wchar_t指針參數。對於字元c類型,printf期待一個wint_t型的參數。
ll 對於整數類型,printf期待一個long long尺寸的整型參數。
L 對於浮點類型,printf期待一個long double尺寸的整型參數。
z 對於整數類型,printf期待一個size_t尺寸的整型參數。
j 對於整數類型,printf期待一個intmax_t尺寸的整型參數。
t 對於整數類型,printf期待一個ptrdiff_t尺寸的整型參數。
Type,也稱轉換說明(conversion specification/specifier),可以是:
d,i 有符號十進制數值int。'%d'與'%i'對於輸出是同義;但對於scanf()輸入二者不同,其中%i在輸入值有前綴0x或0時,分別表示16進制或8進制的值。如果指定了精度,則輸出的數字不足時在左側補0。默認精度為1。精度為0且值為0,則輸出為空。
u 十進制unsigned int。
f,F double型輸出10進制定點表示。'f'與'F'差異是表示無窮與NaN時,'f'輸出'inf', 'infinity'與'nan';'F'輸出'INF', 'INFINITY'與'NAN'。小數點後的數字位數等於精度,最後一位數字四捨五入。精度默認為6。如果精度為0且沒有#標記,則不出現小數點。小數點左側至少一位數字。
e,E double值,輸出形式為10進制的([-]d.ddde[+/-]ddd).E版本使用的指數符號為E(而不是e)。指數部分至少包含2位數字,如果值為0,則指數部分為00。Windows系統,指數部分至少為3位數字,例如1.5e002,也可用Microsoft版的運行時函數_set_output_format修改。小數點前存在1位數字。小數點後的數字位數等於精度。精度默認為6。如果精度為0且沒有#標記,則不出現小數點。
g,G double型數值,當指數部分在閉區間[-4,精度] 內,輸出為指數形式;否則輸出為定點形式。'g'使用小寫字母,'G'使用大寫字母。小數點右側的尾數0不被顯示;顯示小數點僅當輸出的小數部分不為0。
x,X 16進制unsigned int。'x'使用小寫字母;'X'使用大寫字母。
o 8進制unsigned int
s 如果沒有用l標志,輸出null結尾字元串直到精度規定的上限;如果沒有指定精度,則輸出所有位元組。如果用了l標志,則對應函數參數指向wchar_t型的數組,輸出時把每個寬字元轉化為多位元組字元,相當於調用wcrtomb函數。
c 如果沒有用l標志,把int參數轉為unsigned char型輸出;如果用了l標志,把wint_t參數轉為包含兩個元素的wchart_t數組,其中第一個元素包含要輸出的字元,第二個元素為null寬字元。
p void *型
a,A double型的16進製表示,"[−]0xh.hhhhp±d"。其中指數部分為10進製表示的形式。例如:102410輸出為0x1.004000p+10。'a'使用小寫字母,'A'使用大寫字母。[2][3](C++11流使用hexfloat輸出16進制浮點數)
n 不輸出字元,但是把已經成功輸出的字元個數寫入對應的整型指針參數所指的變數。
% '%'字面值,不接受任何flags, width, precision or length。
寬度與精度格式化參數可以忽略,或者直接指定,或者用星號"*"表示取對應函數參數的值。例如printf("%*d", 5, 10)輸出"10";printf("%.*s", 3, "abcdef")輸出"abc"。
如果函數參數太少,不能匹配所有的格式參數說明符,或者函數參數的類型不匹配,將導致未定義(undefined)行為。過多的函數參數被忽略。許多時候,未定義的行為將導致格式化字元串攻擊。
某些編譯器,如GCC,會靜態檢查printf這一類函數的格式化參數並編譯警告存在的問題(當使用編譯標志-Wall或-Wformat)。GCC也會對用戶自定義的printf風格函數做靜態檢查,如果在函數定義時使用了非標準的"format"__attribute__。