2010-05-05 46 views
0

我是一个初学者,我玩了winapi-C的FindFirstFileW()。这个单行代码的路径是:“ \\?\ c:\Français\”,我想将“*”连接到这条路径类型wchar_t(然后我将它用作FindFirstFileW()的arg)。Concat wchar_t C中的Unicode字符串?

我做了我的两个测试用例,第一个是ansi_string(),它似乎工作正常,第二个是unicode_string() - 我不太明白我应该如何将额外的“*”字符串到独特的路径。我将字符串写入文件,因为我无法将单脚编码字符打印到标准输出。

注意:我的目标是学习,这意味着我会欣赏指导和引用适当的资源问候我的情况,我非常初学者,这是我第一次尝试使用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; 
} 

回答

4

出了什么问题:

wchar_t *wcscat(wchar_t *dest, const wchar_t *src); 

这应该做的伎俩吗?

+0

感谢您的快速响应,这是我应用它的方式: wcscpy(* wstr2,* wstr1); wcscat(* wstr2,L“*”); Doori酒吧 – 2010-05-05 02:21:28

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!"); 
+0

他是不是想要连接字符串?不格式化它们? – dlamotte 2010-05-05 00:25:42

+0

@xyld:如果你看他的代码,他试图使用swprintf,我给出了他正在寻找的答案。当然,他可以改变他用于字符串concat的功能。 – 2010-05-05 00:27:12

+0

感谢布赖恩,虽然适当的方法是使用wcscat(),我很欣赏你解释我是如何将已经使用的swprintf()在这种情况下: 的swprintf(* wstr2,L “%s%S”,* wstr1,L “*”); 一个问题,当我编译你的例子:http://codepad.org/KXooLUCh在Windows下,使用MinGW的:GCC -std = C99,我得到了:“功能'的swprintf'隐式声明”,而做同样的在Linux下,我得到了:“通过'swprintf'的参数2传递从指针的整数没有演员”......任何想法? Doori酒吧 – 2010-05-05 02:50:38

1

我将包括 “TCHAR.H”,并使用标准C库的Unicode当量。

strcat(“my \ path \”,“*”);

成为。 (_T(“my \ path \”),_ T(“*”));

仅供参考:您可以使用标准版本的函数调用而不用'W'结尾。编译器会根据您的应用程序的unicode设置将常规调用映射到正确的版本。假设它不是全部的Unicode。

+0

什么是tchar.h? – dlamotte 2010-05-05 01:07:36

+0

感谢您的建议,据我设法谷歌你的建议是只有Windows。即使如此,我目前的需求基于winapi功能 - 我想使用更便携的方法将是首选,所以我会继续使用wcs *系列。 问候你的第二个评论 - 谢谢,我会相应地进行修改。 Doori Bar – 2010-05-05 02:25:54