Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - swprintf (Linux) - неправильная работа

Ответить
Настройки темы
C/C++ - swprintf (Linux) - неправильная работа

Новый участник


Сообщения: 29
Благодарности: 3

Профиль | Отправить 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;
}
При компиляции под Windows все работает, как ожидается; под Linux возникает 2 проблемы:
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
Благодарности: 3

Профиль | Отправить PM | Цитировать


Дополнительно про Linux (если имеет значение)
RHEL 6.5 i686

Отправлено: 15:52, 28-05-2014 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


http://linux.die.net/man/3/swprintf
вроде всё сходится с описанием: нужно %ls, а не %S

Отправлено: 21:41, 28-05-2014 | #3


Новый участник


Сообщения: 29
Благодарности: 3

Профиль | Отправить PM | Цитировать


Цитата pva:
вроде всё сходится с описанием: нужно %ls, а не %S »
увы, %ls == %S, с ним работает точно так же, т.е. неправильно...

Отправлено: 12:55, 29-05-2014 | #4

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


кажется понял:
%S (хотя я такого в мануале не нашёл) и %ls ожидает wchar_t*
а чтобы выводить char*, нужен %s
По крайней мере %s отработал (по моему мнению) правильно.

Жаль, что -Wformat ничего на неправильный код не выдал.

Отправлено: 18:35, 29-05-2014 | #5


Новый участник


Сообщения: 29
Благодарности: 3

Профиль | Отправить PM | Цитировать


Цитата pva:
а чтобы выводить char*, нужен %s
По крайней мере %s отработал (по моему мнению) правильно. »
Это был самый первый вариант, который я попробовал :-)
У меня (GCC, как я уже говорил) он тоже работает неправильно

Отправлено: 19:43, 29-05-2014 | #6

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить 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
Благодарности: 3

Профиль | Отправить PM | Цитировать


Цитата pva:
пробовал так: »
Если Вам не трудно, попробуйте, пожалуйста, мой исходник (я специально его привел - там не статический массив char)
Цитата pva:
Возможно вам следует обновиться из репозитория? »
К сожалению, Linux не является моим штатным рабочим инструментом (установлен в VirtualBox), знаю его плохо: в интернет ходит, обновлять что-либо - не хочет

Последний раз редактировалось RedScorpio, 30-05-2014 в 11:00.


Отправлено: 10:42, 30-05-2014 | #8


Новый участник


Сообщения: 29
Благодарности: 3

Профиль | Отправить 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

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


RedScorpio, делаю так:
1. Копиру код, заменяю %S на %s
Цитата pva:
а чтобы выводить char*, нужен %s
По крайней мере %s отработал (по моему мнению) правильно. »
2. собираю, запускаю, хексдамп:
Код: Выделить весь код
[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



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - swprintf (Linux) - неправильная работа

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Неправильная работа клавиатуры 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




 
Переход