С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Tolias28
206 / 123 / 2
Регистрация: 18.08.2010
Сообщений: 1,011
#1

Как заполнить массив wchar_t пробелами - C++

28.02.2013, 20:42. Просмотров 1724. Ответов 6
Метки нет (Все метки)

Пробовал вот так:
C++
1
2
3
4
5
int length = 4;
wchar_t* str = new wchar_t[length + 1];
FillMemory(str, length,L' ');
str[length] = L'\0';
wprintf(L"%s!", str);
И на консоли получаю такой вывод:
Код
????!
а должно то быть вот так:
Код
    !
Если использовать массив ANSI-символов, то все пашет ок:
C++
1
2
3
4
5
int length = 4;
char* str = new char[length + 1];
FillMemory(str, length,' ');
str[length] = '\0';
printf("%s!", str);
Почему же это на пашет для массива с UNICODE-символами?

Пробовал также делать без символа L перед константными строками, но это результата не меняет (все те же непонятные знаки вопроса на консоли вместо пробелов)
C++
1
2
3
4
5
int length = 4;
wchar_t* str = new wchar_t[length + 1];
FillMemory(str, length,' ');
str[length] = '\0';
wprintf(L"%s!", str);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.02.2013, 20:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как заполнить массив wchar_t пробелами (C++):

Почему const wchar_t* воспринимается как wchar_t* ? - C++
Здравствуйте. Я написал вот так: const wchar_t* dir = directory.c_str(); StartModule(dir); и такая ошибка появляется : ...

Выровнять строки: если в строке меньше 50 символов, заполнить ее пробелами - C++
У меня есть 150 строк с ограничением в 50 символов. Мне необходимо, что бы если в строке меньше 50 символов она заполнялась пробелами.

Записать структуру в wchar_t массив - C++
Подскажите как же можно преобразовать структуру в wchat_t массив, чтобы после записать этот массив в файл через wstream ? Ниже...

Wchar_t двумерный массив с инициализацией - C++
Подскажите, возможно ли сделать двумерный wchar_t массив с инициализацией? wchar_t text; //без инициализации

Указатель на const двумерный массив wchar_t - C++
Подскажите, как создать указатель на в функцию приходит (const wchar_t _text) объявляется wchar_t txt = {L"1", L"2"}; ...

Wchar_t и unsigned wchar_t в windows - C++
Печально, но факт: wchar_t - 2 байта, unsigned wchar_t - 4 байта Вопрос1: используется ли unsigned wchar_t для хранения...

6
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
28.02.2013, 21:35 #2
C++
1
setlocale(0, "");
или
C++
1
std::locale::global(std::locale(""));
0
Tolias28
206 / 123 / 2
Регистрация: 18.08.2010
Сообщений: 1,011
28.02.2013, 22:27  [ТС] #3
xtorne21st, пробовал вызывать и первую и вторую предложенную вами функцию. Ситуацию это не исправляет, а даже наоборот получается что-то еще интереснее: вместо четырех знаков вопроса выводится два крестики и два знака вопроса. Приблизительно вот так: ++??
Только там не плюсы, а эти графиеские символы плюсов(которые когда-то использовались для рисования окон в текстовом режиме)
0
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
28.02.2013, 22:40 #4
Вот на моём линуксе с локалью utf-8:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <stdio.h>
#include <wctype.h>
 
int main(void)
{
    setlocale(0, "");
 
    const int length = 4;
    wchar_t* str = new wchar_t[length+1];
    
    str[0] = L'a'; str[1] = L'b'; str[2] = L'c'; str[3] = L'd';
    wprintf(str);
    wprintf(L"\n");
 
    str[2] = L' ';
    wprintf(str);
    wprintf(L"\n");
 
    delete [] str;
 
    return 0;
}
Bash
1
2
3
ilyuha21st@coldshoot:~/projects$ ./prog
abcd
ab dilyuha21st@coldshoot:~/projects$
0
Tolias28
206 / 123 / 2
Регистрация: 18.08.2010
Сообщений: 1,011
28.02.2013, 22:45  [ТС] #5
xtorne21st, у меня этот код тоже будет работать. А вы попробуйте вместо этого:
C++
1
str[0] = L'a'; str[1] = L'b'; str[2] = L'c'; str[3] = L'd';
вызвать
C++
1
FillMemory(str, length,' ');
и увидите, что будут знаки вопроса.

Добавлено через 1 минуту
Я изначально не знаю длины строки, потому не могу использовать инициализацию подобно тому, как это предложили вы. Да и представьте, если размер строки 100 элементов. Что вы все 100 элементов будете так заполнять?

Добавлено через 1 минуту
эх, пришлось написать свой велосипед... но работающий и удовлетворяющий моему вопросу темы.
C++
1
2
3
4
5
6
7
8
9
void FillString(wchar_t* str, wchar_t ch)
{
    int length = wcslen(str) - 1;
    for(int i = 0; i < length; i++)
    {
        str[i] = ch;
    }
    str[length] = '\0';
}
0
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
28.02.2013, 23:00 #6
Цитата Сообщение от Tolias28 Посмотреть сообщение
FillMemory(str, length,' ');
Это вы откуда выдернули?
0
Tolias28
206 / 123 / 2
Регистрация: 18.08.2010
Сообщений: 1,011
28.02.2013, 23:00  [ТС] #7
Цитата Сообщение от xtorne21st Посмотреть сообщение
Это вы откуда выдернули?
в инете нашел по запросу уже не помню какому. Искал, как заполнить массив символов
0
28.02.2013, 23:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.02.2013, 23:00
Привет! Вот еще темы с ответами:

Cannot convert from 'wchar_t' to 'const wchar_t *' - C++
такой код, порылся в инете не помогло. ломать голову надоело может кто подскажет, буду благодарен. wchar_t * english = L&quot;abvgdee...

Как заполнить массив! - C++
Приветствую Вас друзья! Кто знает подскажите как заполнить массив, числами с плавающей запятой. объявляю: float mas; ...

как заполнить массив - C++
как заполнить массив состоящий из определенного числа элементов

Как заполнить массив - C++
Доброго времени суток, подскажите, как записать данные в такой массив? map&lt;string, map&lt;int, float&gt;&gt; map;


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.