在我之前的帖子中,我找到了使用 C 字串執行此操作的解決方案,但我想知道在 C 中是否也有使用char's 的解決方案。
我當前的解決方案使用我以前的帖子中看到的字串的str.compare()和。size()
現在,由于我只在 中使用一個(多位元組)字符std::string,是否可以使用 a 來實作相同的效果char?
例如,if( str[i] == '?' )?我如何使用char's 來實作這一點?
(編輯:如評論中所指出的,在 SO 上為比較運算子創建了一個型別)
uj5u.com熱心網友回復:
如何在 C 中跨平臺比較單個多位元組字符常量?
您似乎是指使用單個多位元組字符表示的整數字符常量。那么,首先要認識到的是,在 C 中,整數字符常量(例如:'c', '?')的型別int是 ,而不是char。C17 的主要相關部分是第 6.4.4.4/10 段:
整數字符常量的型別為
int。包含映射到單位元組執行字符的單個字符的整數字符常量的值是被解釋為整數的映射字符表示的數值。包含多個字符(例如,'ab')或包含不映射到單位元組執行字符的字符或轉義序列的整數字符常量的值是實作定義的。如果整數字符常量包含單個字符或轉義序列,則它的值是當型別char為單個字符或轉義序列的物件的物件轉換為 type時產生的值int。
(強調補充。)
請注意,“定義的實作”從一開始就意味著有限的可移植性。即使我們排除定義不正當行為的實作,我們仍然有替代方案,例如
- 該實作拒絕包含多位元組源字符的整數字符常量;或者
- 該實作拒絕不映射到單位元組執行字符的整數字符常量;或者
- 無論位元組序列在執行字符集中的重要性如何,實作都通過按位元組標識映射來映射源多位元組字符。
這不是一個詳盡的清單。
您當然可以將整數字符常量相互比較,但如果它們映射到多位元組執行字符,那么您無法將它們與單個chars 進行比較。
由于您的預期應用程式似乎是在 C 字串中定位單個多位元組字符,最自然的做法似乎是使用標準strstr()函式實作 C 方法的 C 模擬。例子:
char str[] = "Some string ? some text ? to see";
char char_to_compare[] = "?";
int char_size = sizeof(char_to_compare) - 1; // don't count the string terminator
for (char *location = strstr(str, char_to_compare);
location;
location = strstr(location char_size, char_to_compare)) {
puts("Found!");
}
在許多情況下,這將做正確的事情,但對于某些執行字符編碼中的某些字符,它仍然可能是錯誤的,例如那些具有多個移位狀態的編碼。
如果您想要對基本執行字符集之外的字符進行穩健處理,那么建議您控制記憶體中的編碼,并對該編碼執行適當的轉換、操作和轉換。例如,這在很大程度上是ICU所做的。
uj5u.com熱心網友回復:
我相信你的意思是這樣的:
char a = '?';
char b = '?';
if (a == b) /*do something*/;
上面的方法可能有效,也可能無效,如果 '?' 的值大于 char 范圍,則會溢位,導致a和b存盤與 '?' 不同的值。不管它們持有哪個值,它們實際上可能都具有相同的值。
請記住,char 型別只是一個單位元組寬(8 位)整數,因此為了使用多位元組字符并避免溢位,您只需使用更寬的整數型別(short、int、long...)。
short a = '?';
short b = '?';
if (a == b) /*do something*/;
根據個人經驗,我還注意到,有時您的環境可能會嘗試使用與您需要的字符編碼不同的字符編碼。例如,嘗試列印 'á' 字符實際上會產生其他內容。
unsigned char x = 'á';
putchar(x); //actually prints character '?' in console.
putchar(160); //will print 'á'.
發生這種情況是因為控制臺使用了擴展 ASCII 編碼,而我的編碼環境實際上使用 Unicode,將 'á' 的值決議為 225 而不是我想要的值 160。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/417140.html
標籤:
上一篇:printf浮點數錯誤
