Concat wchar_t Unicode строки в C? - PullRequest
0 голосов
/ 05 мая 2010

Я новичок, я играю с FindFirstFileW () winapi - C. Unicoded путь: "\\? \ C: \ Français \", и я хотел бы констатировать "*" по этому путитипа wchar_t (тогда я буду использовать его в качестве аргумента для FindFirstFileW ()).

Я сделал два моих теста, первый - ansi_string (), который, кажется, работает нормально, второй - unicode_string ()- что я не совсем понимаю, как я должен согласовать дополнительный символ "*" с unicoded пути.Я записываю строки в файл, потому что я не могу печатать символы Unicoded на стандартный вывод.

Примечание: моя цель - учиться, а это значит, что я буду признателен за рекомендации и ссылки на соответствующие ресурсы в отношении моихСценарий, я очень начинающий, и это моя первая попытка с 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;
}

Ответы [ 3 ]

4 голосов
/ 05 мая 2010

Что не так с:

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

Это должно сработать, верно?

1 голос
/ 05 мая 2010

Я бы включил "tchar.h" и использовал бы юникодные эквиваленты стандартной библиотеки C.

strcat ("my \ path \", "*");

становится.

_tcscat (_T ( "мой \ путь \"), _ T ( "*"));

К вашему сведению: вы можете использовать стандартную версию вызова функции без буквы «W» в конце. Компилятор отобразит обычный вызов на правильную версию в зависимости от настроек юникода вашего приложения. Предполагая, что это либо Юникод, либо нет.

1 голос
/ 05 мая 2010

На основании вашего закомментированного кода вы пытаетесь использовать 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!");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...