我是初学者,我玩winapi的FindFirstFileW() - C.唯一的路径是:“ \\?\ c:\Français\“,我想将”*“连接到这个类型为wchar_t的路径(然后我将它用作FindFirstFileW()的arg。)
我做了两个我的测试用例,第一个是ansi_string()似乎工作正常,第二个是unicode_string() - 我不太明白我应该如何将额外的“*”char连接到unicoded路径。我将字符串写入文件,因为我无法将单编码字符打印到stdout。
注意:我的目标是学习,这意味着我将非常感谢指导和对适合我的场景的适当资源的参考,我是一个初学者,这是我第一次使用Unicode。
谢谢,Doori Bar
#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;
}
答案 0 :(得分:4)
出了什么问题:
wchar_t *wcscat(wchar_t *dest, const wchar_t *src);
这应该做对了吗?
答案 1 :(得分:1)
根据您的注释代码,您尝试使用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!");
答案 2 :(得分:1)
我将包含“tchar.h”并使用标准C库的unicode等价物。
strcat(“my \ path \”,“*”);
变。
_tcscat(_T( “我的\路径\”),_ T( “*”));
仅供参考:您可以使用标准版本的函数调用而不使用“W”。编译器会根据您应用程序的unicode设置将常规调用映射到正确的版本。假设它或者都是Unicode。