реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Текстовая строка без нулевого байта, как избавиться от terminating null?
sonycman
сообщение Jun 21 2009, 11:48
Сообщение #1


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Компилятор RealView из комплекта Keil MDK3.70.

Хочется получить текстовую строку в юникоде без нулевого байта.
Строки вида L"Text" включают в себя нулевой байт.
Как от него избавиться?

ЗЫ: и вообще, интересно, как в Си получить строку без нуля на конце?
Конструкция вида 'Text' не прокатывает - компилер ругается на слишком много символов...
Go to the top of the page
 
+Quote Post
SM
сообщение Jun 21 2009, 11:56
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



static char tst[4] = "ABCD"; // и будет Вам 4 байта
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 21 2009, 12:00
Сообщение #3


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(SM @ Jun 21 2009, 15:56) *
static char tst[4] = "ABCD"; // и будет Вам 4 байта

Попробовал:
Код
static char    a[4] = "ABCD";
main.cpp(112): error:  #144: a value of type "const char [5]" cannot be used to initialize an entity of type "char [4]"
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Jun 21 2009, 12:05
Сообщение #4


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



const char a[4] = { 'A','B','C','D'};
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 21 2009, 12:17
Сообщение #5


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(HARMHARM @ Jun 21 2009, 16:05) *
const char a[4] = { 'A','B','C','D'};

Это я знаю, но это крайний случай, слишком неудобно.
Во первых, надо вручную подсчитывать число знаков, во вторых, юзать неудобоваримую запись текста...
Гораздо приятнее работать с видом "Some text", а всю рутинную работу должен делать компилятор.

Странно, что в Си нет встроенного удобного механизма для исключения лишнего нулевого байта, ведь не всегда же он нужен!
Go to the top of the page
 
+Quote Post
SM
сообщение Jun 21 2009, 12:28
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Видимо из-за того, что C++, а не C. Я такое в MSVC без проблем использую, но именно в ".c" файлах. В gcc тоже. А вот с вашим конкретным компилером к сожалению не знаком, но по идее должно работать, если речь все же о Си, а не о плюсах.
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Jun 21 2009, 12:29
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Цитата
main.cpp...

так C или C++?
Не поверил, что не фунциклирует
static char a[4] = "ABCD";
и проверил в IAR 4.11B для MSP430 - всё путём


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 21 2009, 12:33
Сообщение #8


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Ну, у вас IAR, а у меня RV и С++...
Интересно, почему в плюсах порезали такую фичу?
Go to the top of the page
 
+Quote Post
SM
сообщение Jun 21 2009, 12:35
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(sonycman @ Jun 21 2009, 16:33) *
и С++...

А по что тогда дезинформацию вносите?

Вы же спрашивали - "ЗЫ: и вообще, интересно, как в Си получить строку без нуля на конце?"

если в C++ то свой класс такой строки написать.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jun 21 2009, 12:36
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(sonycman @ Jun 21 2009, 20:17) *
Во первых, надо вручную подсчитывать число знаков...
sizeof() в помощь


--------------------
Go to the top of the page
 
+Quote Post
SM
сообщение Jun 21 2009, 12:39
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(sonycman @ Jun 21 2009, 16:17) *
Во первых, надо вручную подсчитывать число знаков, во вторых, юзать неудобоваримую запись текста...

не надо, можно написать
char a[] = {...};
а с во вторых - согласен.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 21 2009, 13:16
Сообщение #12


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



В общем, юзаю пока конструкцию L"String text", а затем в программе приходится вычитать 2 байта из длины строки.
Но лишние нули в памяти, конечно же, присутствуют...
Go to the top of the page
 
+Quote Post
SM
сообщение Jun 21 2009, 13:17
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(sonycman @ Jun 21 2009, 17:16) *
В общем, юзаю пока конструкцию L"String text", а затем в программе приходится вычитать 2 байта из длины строки...

Это зачем? Длина строки - strlen - возвращает длину без нулевого символа. Точнее, в Вашем случае, wcslen - таким образом

static wchar_t string[] = L"qwdqwedqwed"; и ничего нигде вручную считать не надо. wcslen даст сразу нужную длину. А вот 2 байта - да.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 21 2009, 13:30
Сообщение #14


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(SM @ Jun 21 2009, 17:17) *
Это зачем?

А у меня эти строки лежат внутри строкового USB дескриптора, и длина всего дескриптора включает в себя, кроме строки, ещё несколько полей.
Поэтому из общей длины дескриптора приходится вычитать 2, чтобы не передавать лишние нули - неизвестно, как их воспримет хост...

Зато, с другой стороны, изменить содержимое строк очень просто smile.gif

Спасибо за помощь!
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Jun 21 2009, 13:40
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Цитата
А у меня эти строки лежат внутри строкового USB дескриптора

Если это единый текстовый "блок", то может быть удобной передача его как одной строки.
Тогда можно записать это одной строкой, но "не совсем обычным способом"(С) (дальше было "- в кредит и за советские рубли"):
Код
const char descriptor[]=
"Строка 1"
"Строка 2"
"Прибамбас"
"Фишечка";


--------------------
aka Vit
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th June 2025 - 20:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01512 секунд с 7
ELECTRONIX ©2004-2016