C 程式設計/wchar.h/函式參考
fgetws 是 C 程式語言中的一個函式。它是 fgets 函式的寬字元版本。fgetws 中的 w 代表寬。fgetws 根據流是文字/二進位制模式開啟,分別將字串讀取為多位元組字元或寬字元字串。fgetws 子例程從輸入流讀取字元,將其轉換為相應的寬字元程式碼,並將它們放置到字串引數指向的陣列中。
該子例程將持續執行,直到:
- 讀取了由數字引數 "-1" 指定的字元數量
- 該子例程遇到換行符或 EOF 字元。
fgetws 子例程以 NULL 寬字元終止寬字元字串。
#include <stdio.h>
#include <wchar.h>
wchar_t *fgetws(
wchar_t *string;
int n;
FILE *stream ;
);
fgetws 有三個引數
string- 用於提供資料儲存位置的字串n- 可讀字元的最大數量stream- FILE 指標
雖然 fgetws 相對於 fgets 更寬,但它可以透過與 stdio.h 一起使用的另一個可選標頭檔案 wchar.h 進行編譯。但是,fgets 必須使用 stdio.h。因此,fgetws 提供了選擇。
與 fgets 函式一樣,fgetws 函式也返回相同的值字串,即成功時返回 ws。該函式使用 NULL 指標處理錯誤條件。對於錯誤甚至在 EOF(檔案結尾)時,函式呼叫都返回 NULL 指標。也可以使用 feof 或 ferror 來確定錯誤。
ubuntu、fedora、ANSI、Win 98、Win Me、Win NT、Win 2000、Win XP
- http://pubs.opengroup.org/onlinepubs/009695399/functions/fgetws.html
- http://www.freebsd.org/cgi/man.cgi?query=fgetws&apropos=0&sektion=0&manpath=FreeBSD+7.1-RELEASE&format
- http://msdn.microsoft.com/en-us/library/c37dh6kf(v=vs.71).aspx
- http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/getws.htm
mbrlen 是標準庫函式,用於使用轉換狀態確定多位元組字元的長度。mbrlen 函式與其 'mblen' 'mblen l' 的區別在於其可重啟性。
要在程式中使用此函式,請包含標準標頭檔案<wchar.h>。
size_t mbrlen (const char *s, size_t maxsize, mbstate_t *ps ).
mbrlen() 函式最多檢查指向 i.e. s 的字串的 maxsize,並提取下一個完整的 multibyte character。它更新 shift state *ps。如果 multibyte character 不是 NULL wide character,則返回 s 消耗的位元組數。
(size_t) - 2 : 在所有 maxsize character 被轉換後,生成的轉換狀態指示一個不完整的 multibyte character。
(size_t) - 1 : 該函式在完成下一個 multibyte character 之前檢測到編碼錯誤,在這種情況下,該函式會將 errno 設定為 EILSEQ,並使生成的轉換狀態未定義。
0 : 下一個完整的 character 是一個 null character,在這種情況下,生成的轉換狀態是初始轉換狀態。
正數 : 如果下一個 n 或更少的 byte 完成一個有效的 character ; 返回的值將是完成 character 的位元組數。
- http://pubs.opengroup.org/onlinepubs/9699919799/functions/mbrlen.html .
- http://www.qnx.com/developers/docs/6.5.0/index.jsp?topic=/com.qnx.doc.neutrino_lib_re/m/mbrlen.html.
- http://publib.boulder.ibm.com/infocenter/pseries/v5r3/topic/com.ibm.aix.basetechref/doc/basetrf1/mbrlen.htm.
mbrtowc() 使用轉換狀態將 multibyte character 轉換為 wide character
#include <wchar.h>
size_t mbrtowc(wchar_t *pwc, const char *s, size_t n, mbstate_t *ps);
假設 s 是一個空指標。那麼可以將 mbrtowc() 函式呼叫為
mbrtowc(NULL, "", 1, ps);
這裡 pwc 和 n 的值會被忽略。
如果 s 不是 NULL,該函式應該檢查從 s 最初指向的位置開始的最多 n 個位元組,以確定完成下一個 character 所需的位元組數,並確定相應 wide character 的值。然後,如果 pwc 不是空指標,則將該值儲存在 pwc 指向的物件中。如果該相應 wide character 是 wide null character,則無論生成的轉換狀態是什麼,都將是初始轉換狀態。
如果指定的 state pointer i.e. 如果 ps 是一個空指標,那麼 mbrtowc() 函式應該使用它自己的 mbstate_t 物件,該物件應該在程式啟動時初始化為初始轉換狀態。否則,應使用 ps 指向的 mbstate_t 物件來描述關聯 character 序列的當前轉換狀態。
s:
s 用於作為要轉換或計數的字串的位元組。
n:
n 用於指定要檢查的最大位元組數。
ps:
ps 是轉換狀態。如果這是空值,則使用內部 mbstate_t 物件。
0:
當下一個 count 或更少的位元組完成代表 null wide character 的 multibyte character 時,它返回 0。
>0:
當下一個 count 或更少的位元組完成有效的 multibyte character 時,它返回大於零的值,即正值,返回的值是完成 multibyte character 的位元組數。
-1:
當發生編碼錯誤時,它返回 -1,即下一個 count 或更少的位元組沒有為完整的有效 multibyte character 做出貢獻,errno 值將為 EILSEQ,並且轉換狀態令人困惑,因為它可以以多種方式理解。
-2
當下一個 count 個位元組對不完整的 multibyte character 做出貢獻,並且所有 count 個位元組都已處理時,它返回 -2。
http://pubs.opengroup.org/onlinepubs/009604499/functions/mbrtowc.html
Putwc()
c 用於要寫入的字元。stream 用於指向 **FILE** 結構的指標。
這是一個標準庫函式。此函式將寬字元寫入 FILE 流。它包含在標準庫 Wchar.h 中。putwc() 函式將寬字元寫入輸出流。它相應地向前移動檔案位置。putwc() 函式與 fputwc() 相同。
成功時,此函式返回 0。否則它將返回非零值。
swprintf是 C 標準庫 函式,如 wchar.h 中所定義,其必需的標頭檔案是 stdio.h 和 wchar.h。它的函式簽名為
'int swprintf(wchar_t *s,, size_t n, const wchar_t format,...);
swprintf 的簽名
s : 它指向緩衝區的指標,您希望將格式化的字串儲存在其中。格式化字串提供所需的額外引數
n : 它是要儲存在緩衝區中的最大字元數,附加空字元。
format : 這是一個寬字元字串,顯示輸出的格式。
swprintf 函式將寬字元輸出到寬字元陣列。程式設計師必須確保在 's' 處至少有 'n' 個寬字元的空間。
swprintf() 是在 *s 開始的連續寬字元中的空字元之後列印輸出的函式。它最多列印 n 個字元,直到出現下一個空字元。swprintf 是 sprintf 的寬字元版本。指向 swprintf 的指標引數是寬字元字串
此函式返回寫入的字元數,如果存在錯誤,則返回 -1。如果 s(指向緩衝區的指標)或 format 是空指標,則會呼叫無效引數。如果程式允許執行此程式碼,則它返回 -1 或 errno 設定為 EINVAL。swprintf 返回儲存在 's'(緩衝區)中的寬字元數,不計算最後一個空字元。
#include <wchar.h> wchar_t *wcscat(wchar_t *a, const wchar_t *b);
strcat 和 Wcscat 函式完成的工作與前面提到的相同,即連線兩個字串。不同之處在於 strcat 函式接受(普通)**字元字串**,而 wcscat 函式接受**寬字元字串**作為引數。
wcscat 函式將寬字元字串複製為例如 **b**,包括 '\0'(在字串 b 的末尾),在寬字元字串的末尾,例如 **a**。字串 a 的 '\0' 字元被字串 'b' 的第一個字元替換。即函式將字串 'b' 附加到字串 'a' 的末尾。如果寬字元字串 'a' 是 "hello",而寬字元字串 'b' 是 "world"。在呼叫函式 wcscat(a , b) 之後,字串 'a' 變為 "helloworld",而字串 'b' 保持不變。寬字串 'a' 必須至少具有 (strlen(a) + strlen(b) +1) 位元組的記憶體,以便它可以儲存 wcs(寬字元字串)'a',wcs 'b' 和 '\0'。
#include <stdio.h>
#include <wchar.h>
#define SIZE 32
int main() {
wchar_t destination[SIZE] = L"Hello"; /*SIZE should be sufficient enough to store both strings and NULL termination '\0' */
wchar_t * source = L" World";
wchar_t * ptr;
ptr = wcscat( destination, source );
printf(" %ls\n", ptr ); /* prints "hello World"*/
/*OR printf("%ls\n" , destination);*/
return 0;
}
程式的輸出將是 ' Hello World '。
寬字元字串 'source'(World)附加在寬字元字串 'destination'(Hello)的末尾。
wcscat() 函式返回指向寬字元字串 'a' 的指標,即指向連線字串的指標。
在 C 語言中,函式 wcscmp 包含在標頭檔案 wchar.h 中,wcscmp 類似於 strcmp,即它用於比較兩個字串。但是函式 wcscmp 用於比較寬字元字串。如果要比較兩個寬字元字串,例如 s1 和 s2。然後函式 wcscmp 如果 s1 大於 s2,則返回正整數。如果字串 s2 大於 s1,則返回負整數。如果兩個寬字元字串(即 s1 和 s2)相同,則函式返回 0。
#include <wchar.h>
int wcscmp(const wchar_t *s1, const wchar_t *s2);
#include <stdio.h>
#include <wchar.h>
int main() {
wchar_t string1[] = L"char";
wchar_t string2[] = L"character";
int difference;
difference = wcscmp( string1, string2 );
if ( difference == 0 )
printf( " Both strings are same" );
else {
if ( difference < 0 )
printf( " char is less than character\n" );
else
printf(" char is greater than character\n" );
}
return 0;
}
程式的輸出將是 'char 小於 character '
因為差值的符號為負。
Wcsncmp 是用於比較兩個寬字元字串的標準庫函式。該函式類似於標準庫函式 strcmp。但比較不像 strcmp。第一個區別是函式 wcsncmp 最多比較兩個字串到某個限制(最多 n 個字元),即 **size_t n**,但 strcmp 比較字串直到出現 '\0'。第二個區別是它處理寬字元,如前所述。它比較指向例如 **a** 的寬字元字串和指向例如 **b** 的寬字元字串,但最多比較每個字串的 **n** 個寬字元。
如果寬字元字串 **a** 在第一個不同位置 i(i < n)處大於寬字元字串 **b**,則函式 Wcsncmp 返回正整數,如果第二個字串在第一個不同位置 i(i < n)處大於第一個字串,則函式 wcsncmp 返回負整數。如果 **a** 和 **b** 的前 i 個字元(i < n)相等,則函式 wcsncmp 返回 0。
在 C 程式語言中,使用函式 wcsncmp()、wcscat()、labs、mempcpy。函式 wcscpy 類似於 strcpy()。strcpy() 用於複製字串,而 wcscpy() 用於處理寬字串以進行復制。它將 src 指向的寬字元字串(包括終止的 L'\0' 字元)複製到 dest 指向的陣列中。