Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
Tolias28
206 / 126 / 8
Регистрация: 18.08.2010
Сообщений: 1,009
#1

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

28.02.2013, 20:42. Просмотров 2068. Ответов 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
Ответы с готовыми решениями:

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

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

Записать структуру в wchar_t массив
Подскажите как же можно преобразовать структуру в wchat_t массив, чтобы после...

Wchar_t двумерный массив с инициализацией
Подскажите, возможно ли сделать двумерный wchar_t массив с инициализацией? ...

Указатель на const двумерный массив wchar_t
Подскажите, как создать указатель на в функцию приходит (const wchar_t...

6
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 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 / 126 / 8
Регистрация: 18.08.2010
Сообщений: 1,009
28.02.2013, 22:27  [ТС] #3
xtorne21st, пробовал вызывать и первую и вторую предложенную вами функцию. Ситуацию это не исправляет, а даже наоборот получается что-то еще интереснее: вместо четырех знаков вопроса выводится два крестики и два знака вопроса. Приблизительно вот так: ++??
Только там не плюсы, а эти графиеские символы плюсов(которые когда-то использовались для рисования окон в текстовом режиме)
0
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 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 / 126 / 8
Регистрация: 18.08.2010
Сообщений: 1,009
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 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
28.02.2013, 23:00 #6
Цитата Сообщение от Tolias28 Посмотреть сообщение
FillMemory(str, length,' ');
Это вы откуда выдернули?
0
Tolias28
206 / 126 / 8
Регистрация: 18.08.2010
Сообщений: 1,009
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

Wchar_t и unsigned wchar_t в windows
Печально, но факт: wchar_t - 2 байта, unsigned wchar_t - 4 байта ...

Cannot convert from 'wchar_t' to 'const wchar_t *'
такой код, порылся в инете не помогло. ломать голову надоело может кто...

Как заполнить массив!
Приветствую Вас друзья! Кто знает подскажите как заполнить массив, числами с...


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

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

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