|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - swprintf (Linux) - неправильная работа |
|
|
C/C++ - swprintf (Linux) - неправильная работа
|
Новый участник Сообщения: 29 |
Профиль | Отправить PM | Цитировать Добрый день
Не могу добиться правильной работы swprintf под Linux #include <stdio.h> #include <wchar.h> #include <string.h> int main() { FILE *fileOut; wchar_t wcBuffer[264]; char *cBuffer = "string"; printf("\n\tTest module (swprinf)\n"); if ((fileOut = fopen("testfile.txt", "wb")) == NULL) { printf("\tCan't open file \"testfile.txt\""); return -1; } // Case 1 memset(wcBuffer, 0x00, sizeof(wcBuffer)); #ifdef __linux swprintf(wcBuffer, 260, L"Test_string_1"); #else swprintf(wcBuffer, L"Test_string_1"); #endif fwrite(wcBuffer, sizeof(wcBuffer), 1, fileOut); // Case 2 memset(wcBuffer, 0x00, sizeof(wcBuffer)); #ifdef __linux swprintf(wcBuffer, 260, L"Test_%S_2", cBuffer); #else swprintf(wcBuffer, L"Test_%S_2", cBuffer); #endif fwrite(wcBuffer, sizeof(wcBuffer), 1, fileOut); fclose(fileOut); return 0; } 1. Case 2. Вместо Test_string_2 в файле оказывается записан шаблон Test_%S_2 2. Case 1+2. После строки в файле оказывается "мусор" (под Windows идут аккуратные 0х00, как задумывалось) В чем моя ошибка? Спасибо PS. Компиляторы: Linux GCC 4.4.7 (3.x.x тоже испытывался), опции -Wall -fshort-wchar -O2 -m32 -s -U__STRICT_ANSI__ Windows MinGW |
|
Отправлено: 14:45, 28-05-2014 |
Новый участник Сообщения: 29
|
Профиль | Отправить PM | Цитировать Дополнительно про Linux (если имеет значение)
RHEL 6.5 i686 |
Отправлено: 15:52, 28-05-2014 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать http://linux.die.net/man/3/swprintf
вроде всё сходится с описанием: нужно %ls, а не %S |
Отправлено: 21:41, 28-05-2014 | #3 |
Новый участник Сообщения: 29
|
Профиль | Отправить PM | Цитировать Цитата pva:
|
|
Отправлено: 12:55, 29-05-2014 | #4 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать кажется понял:
%S (хотя я такого в мануале не нашёл) и %ls ожидает wchar_t* а чтобы выводить char*, нужен %s По крайней мере %s отработал (по моему мнению) правильно. Жаль, что -Wformat ничего на неправильный код не выдал. |
|
Отправлено: 18:35, 29-05-2014 | #5 |
Новый участник Сообщения: 29
|
Профиль | Отправить PM | Цитировать Цитата pva:
У меня (GCC, как я уже говорил) он тоже работает неправильно |
|
Отправлено: 19:43, 29-05-2014 | #6 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать пробовал так:
#include <stdio.h> #include <wchar.h> #include <string.h> int main() { static unsigned const length = 200; static const wchar_t wcs[] = L"asdsd"; static const char cs[] = "gfdkgjh"; wchar_t mem[length], correct[]=L"|gfdkgjh|asdsd|200|\n"; int diff; swprintf(mem, length, L"|%s|%S|%d|\n", cs, wcs, length); diff = wcscmp(mem, correct); if (diff) { printf("failed!\n"); } fwrite(mem, sizeof(*mem), wcslen(mem), stdout); fwrite(correct, sizeof(*correct), wcslen(correct), stdout); return diff; } [andrey@localhost 1]$ gcc test.c [andrey@localhost 1]$ ./a.out |gfdkgjh|asdsd|200| |gfdkgjh|asdsd|200| [andrey@localhost 1]$ ./a.out |hexdump -c 0000000 | \0 \0 \0 g \0 \0 \0 f \0 \0 \0 d \0 \0 \0 0000010 k \0 \0 \0 g \0 \0 \0 j \0 \0 \0 h \0 \0 \0 0000020 | \0 \0 \0 a \0 \0 \0 s \0 \0 \0 d \0 \0 \0 0000030 s \0 \0 \0 d \0 \0 \0 | \0 \0 \0 2 \0 \0 \0 0000040 0 \0 \0 \0 0 \0 \0 \0 | \0 \0 \0 \n \0 \0 \0 0000050 | \0 \0 \0 g \0 \0 \0 f \0 \0 \0 d \0 \0 \0 0000060 k \0 \0 \0 g \0 \0 \0 j \0 \0 \0 h \0 \0 \0 0000070 | \0 \0 \0 a \0 \0 \0 s \0 \0 \0 d \0 \0 \0 0000080 s \0 \0 \0 d \0 \0 \0 | \0 \0 \0 2 \0 \0 \0 0000090 0 \0 \0 \0 0 \0 \0 \0 | \0 \0 \0 \n \0 \0 \0 00000a0 [andrey@localhost 1]$ uname -a Linux localhost 3.14.3-2-ARCH #1 SMP PREEMPT Mon May 12 20:54:05 CEST 2014 i686 GNU/Linux |
Отправлено: 20:59, 29-05-2014 | #7 |
Новый участник Сообщения: 29
|
Профиль | Отправить PM | Цитировать Цитата pva:
пробовал так: » Если Вам не трудно, попробуйте, пожалуйста, мой исходник (я специально его привел - там не статический массив char) Цитата pva: Возможно вам следует обновиться из репозитория? » К сожалению, Linux не является моим штатным рабочим инструментом (установлен в VirtualBox), знаю его плохо: в интернет ходит, обновлять что-либо - не хочет |
Последний раз редактировалось RedScorpio, 30-05-2014 в 11:00. Отправлено: 10:42, 30-05-2014 | #8 |
Новый участник Сообщения: 29
|
Профиль | Отправить PM | Цитировать У меня получается так (wchar_t 2-х байтный)
[asap@RHEL65x32 Test]$ cat testfile.txt | hexdump -c 0000000 T \0 e \0 s \0 t \0 _ \0 s \0 t \0 r \0 0000010 i \0 n \0 g \0 _ \0 1 \0 \0 \0 T \0 e \0 0000020 s \0 t \0 _ \0 % \0 s \0 _ \0 2 \0 \0 \0 0000030 001 033 003 ; \0 \0 \0 003 \0 \0 \0 204 376 377 377 0000040 < \0 \0 \0 224 376 377 377 \ \0 \0 \0 356 376 377 377 0000050 210 \0 \0 \0 024 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 0000060 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 * 0000210 T \0 e \0 s \0 t \0 _ \0 % \0 s \0 _ \0 0000220 2 \0 \0 \0 001 033 003 ; \0 \0 \0 003 \0 \0 \0 0000230 204 376 377 377 < \0 \0 \0 224 376 377 377 \ \0 \0 \0 0000240 356 376 377 377 210 \0 \0 \0 024 \0 \0 \0 \0 \0 \0 \0 0000250 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 |
Отправлено: 10:58, 30-05-2014 | #9 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать RedScorpio, делаю так:
1. Копиру код, заменяю %S на %s Цитата pva:
[andrey@localhost 1]$ hexdump -c <testfile.txt 0000000 T \0 \0 \0 e \0 \0 \0 s \0 \0 \0 t \0 \0 \0 0000010 _ \0 \0 \0 s \0 \0 \0 t \0 \0 \0 r \0 \0 \0 0000020 i \0 \0 \0 n \0 \0 \0 g \0 \0 \0 _ \0 \0 \0 0000030 1 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 0000040 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 * 0000420 T \0 \0 \0 e \0 \0 \0 s \0 \0 \0 t \0 \0 \0 0000430 _ \0 \0 \0 s \0 \0 \0 t \0 \0 \0 r \0 \0 \0 0000440 i \0 \0 \0 n \0 \0 \0 g \0 \0 \0 _ \0 \0 \0 0000450 2 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 0000460 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 * 0000840 |
|
Отправлено: 21:33, 30-05-2014 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Неправильная работа клавиатуры Asus K53S | vadim1000 | Ноутбуки | 8 | 10-09-2014 12:16 | |
[решено] Realtek ALC889 неправильная работа колонок 5.1 | Третий | Непонятные проблемы с Железом | 1 | 16-12-2011 07:55 | |
Службы - [решено] Неправильная работа центра обновлений | Solovey1985 | Microsoft Windows Vista | 3 | 08-08-2010 18:38 | |
[решено] Неправильная работа клавиатуры | dnaop | Лечение систем от вредоносных программ | 15 | 14-02-2009 15:24 | |
Linux. Работа с конслью | AnGel_of_Death | Общий по Linux | 11 | 29-07-2006 16:43 |
|