[英]Concat wchar_t Unicode strings in C?
我是一個初學者,我玩winapi-C的FindFirstFileW()。未編碼的路徑是:“ \\\\?\\ c:\\Français\\”,我想將“ *”鏈接到wchar_t類型的路徑(然后,我將其用作FindFirstFileW()的arg)。
我做了兩個測試用例,第一個是ansi_string()看起來不錯,第二個是unicode_string()-我不太了解如何將額外的“ *”字符連接到未編碼的路徑。 我將字符串寫到文件中,因為我無法將Unicoded字符輸出到stdout。
注意:我的目標是學習,這意味着我會很高興獲得指導和對與我的情況有關的適當資源的參考,我是一個初學者,這是我第一次嘗試Unicode。
謝謝,Doori酒吧
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <string.h>
#include <errno.h>
void *error_malloc(int size);
void ansi_string(char **str1, char **str2);
void unicode_string(wchar_t **wstr1, wchar_t **wstr2);
void unicode_string(wchar_t **wstr1, wchar_t **wstr2)
{
/* assign wstr1 with the path: \\?\c:\Français\ */
*wstr1 = error_malloc((wcslen(L"\\\\?\\c:\\Français\\")+1) *sizeof(**wstr1));
wcscpy(*wstr1,L"\\\\?\\c:\\Français\\");
/* concat wstr1+"*" , assign wstr2 with: \\?\c:\Français\* */
*wstr2 = error_malloc((wcslen(*wstr1) + 1 + 1) * sizeof(**wstr1));
/* swprintf(*wstr2,"%ls*",*wstr1); */
/* how should I concat wstr1+"*"? */
wcscpy(*wstr2,L"\\\\?\\c:\\Français\\");
}
void ansi_string(char **str1, char **str2)
{
/* assign str1 with the path: c:\English\ */
*str1 = error_malloc(strlen("c:\\English\\") + 1);
strcpy(*str1,"c:\\English\\");
/* concat str1+"*" , assign str2 with: c:\English\* */
*str2 = error_malloc(strlen(*str1) + 1 + 1);
sprintf(*str2,"%s*",*str1);
}
void *error_malloc(int size)
{
void *ptr;
int errornumber;
if ((ptr = malloc(size)) == NULL) {
errornumber = errno;
fprintf(stderr,"Error: malloc(): %d; Error Message: %s;\n",
errornumber,strerror(errornumber));
exit(1);
}
return ptr;
}
int main(void)
{
FILE *outfile;
char *str1;
char *str2;
wchar_t *wstr1;
wchar_t *wstr2;
if ((outfile = fopen("out.bin","w")) == NULL) {
printf("Error: fopen failed.");
return 1;
}
ansi_string(&str1,&str2);
fwrite(str2, sizeof(*str2), strlen(str2), outfile);
printf("strlen: %d\n",strlen(str2));
printf("sizeof: %d\n",sizeof(*str2));
free(str1);
free(str2);
unicode_string(&wstr1,&wstr2);
fwrite(wstr2, sizeof(*wstr2), wcslen(wstr2), outfile);
printf("wcslen: %d\n",wcslen(wstr2));
printf("sizeof: %d\n",sizeof(*wstr2));
free(wstr1);
free(wstr2);
fclose(outfile);
return 0;
}
有什么問題:
wchar_t *wcscat(wchar_t *dest, const wchar_t *src);
?
那應該成功嗎?
根據您評論的代碼,您正在嘗試使用swprintf,因此我將在此基礎上進行回答。
在sprintf中,可以將%S
用作寬字符串參數,將%s
用作多字節字符串參數。
在swprintf中,可以將%s
用作寬字符串參數,將%S
用作多字節字符串參數。
很容易記住,如果您只是認為%s
與您正在使用的函數的相同類型的字符串匹配。
例:
wchar_t wsz[1024];
char sz[1024];
swprintf(wsz, L"%s %S", L"Hello", "world!");
sprintf(sz, "%S %s", L"Hello", "world!");
我將包括“ tchar.h”並使用標准C庫的unicode等效項。
strcat(“ my \\ path \\”,“ *”);
成為。
_tcscat(_T(“ my \\ path \\”),_ T(“ *”));
僅供參考:您可以使用標准版本的函數調用,而無需在末尾加上“ W”。 編譯器將根據您應用的unicode設置將常規調用映射到正確的版本。 假設它不是全部Unicode。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.