Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Второй ноль на конце стринга


Автор: bass 24.6.2012, 13:13
Добрый день прошу прощения за ламерский вопрос но не люблю студию.... А прешлось проект перетаскивать именно на нее....
Так в проекте есть в нескольких местах чар с двумя нулями на конце.....

Код Builder
Код

String Buffer = "bla bla"; 
Buffer.SetLength(Buffer.Length()+1);
Вызов в функции &Buffer[1] 


В студии такая конструкция отказалась работать вот так будет, лень лезть отладчиком(это длл) если нет то как реализовать.
Код

String Buffer = "bla bla"; 
Buffer +=  "\x0";
Вызов в функции &Buffer[1] 


Заранее спасибо.

Автор: borisbn 24.6.2012, 14:36
Немного сумбурно... но, кажется понятно.
И в билдере и в студии можно записать так
Код
String Buffer = "bla bla\0\0";

Автор: bass 24.6.2012, 16:16
Цитата(borisbn @ 24.6.2012,  14:36)
Немного сумбурно... но, кажется понятно.
И в билдере и в студии можно записать так
Код
String Buffer = "bla bla\0\0";

Надесь что += "\0" добавит в конце ноль....

Автор: borisbn 24.6.2012, 17:02
Цитата(bass @  24.6.2012,  16:16 Найти цитируемый пост)
Надесь что += "\0" добавит в конце ноль.... 

нет. не добавит. т.к. это равносильно тому, что написать
Код
String s = "bla";
s += "";

Автор: KaZepKa 24.6.2012, 20:23
Разве класс string сам не ставит в конце строки \0  ?

А тормознул, второй ноль надо...

Автор: bass 25.6.2012, 03:50
Цитата(borisbn @ 24.6.2012,  17:02)
Цитата(bass @  24.6.2012,  16:16 Найти цитируемый пост)
Надесь что += "\0" добавит в конце ноль.... 

нет. не добавит. т.к. это равносильно тому, что написать
Код
String s = "bla";
s += "";

Так я понял что данная конструкция работать не будет....... Если записать таким образом как было предложено выше то два нуля будут ..... А как добавить второй ноль в существующий стринг в студии.....

Автор: math64 25.6.2012, 07:30
Цитата(borisbn @ 24.6.2012,  14:36)
Немного сумбурно... но, кажется понятно.
И в билдере и в студии можно записать так
Код
String Buffer = "bla bla\0\0";

Это добавит три нуля (или только один - смотря как реализован конструктор String). Один ноль C/C++ в строковой константе и так добавляет.
Если конструктор String выглядит примерно так:
Код

String::String(const char* s) {
m_length = strlen(s);
m_str = new char[m_length+1];
strcpy(m_str, s);
}

то сколько нулей не добавляй в строковую константу, в результате окажется только один.
Если есть такой конструктор:
Код

String::String(const char* s, int len) {
m_length = len;
m_str = new char[m_length+1];
strncpy(m_str, s, len);
m_str[len] = 0;
}

то тужно использовать его.

Автор: borisbn 25.6.2012, 08:22
Цитата(bass @  25.6.2012,  03:50 Найти цитируемый пост)
А как добавить второй ноль в существующий стринг в студии.....

во-первых, чего-то я поспешил... согласен с math64
во-вторых, в студии нет класса String (именно в этом написании). Возможно есть C++ CLI, но это - уже не Си++.
в-третьих, возможно придётся воспользоваться Си-строками
Код
std::string str = "bla bla";
int str_len = str.length();
char * c_str = new char[ str_len + 2 ];
strcpy( c_str, str.c_str() );
c_str[ str_len + 1 ] = 0;


Автор: 586 25.6.2012, 10:11
Нулевой символ в std::string можно так можно добавить:
Код
std::string Buffer = "bla bla";
Buffer += '\0';


И кстати, в VCL тоже можно нулевой символ таким способом добавить, при этом строка после этого работает исправно:
Код
#include <vcl.h>
#include <iostream>

int main(int argc, char* argv[])
{
    String s;
    s += '\0';
    std::cout << s.Length() << ' ';
    s += "a";
    std::cout << s.Length() << ' ';

    std::cin.get();
    return 0;
}

Автор: bass 25.6.2012, 10:36
Цитата(586 @ 25.6.2012,  10:11)
Нулевой символ в std::string можно так можно добавить:
Код
std::string Buffer = "bla bla";
Buffer += '\0';


И кстати, в VCL тоже можно нулевой символ такум способом добавить, при этом строка после этого работает исправно:
Код
#include <vcl.h>
#include <iostream>

int main(int argc, char* argv[])
{
    String s;
    s += '\0';
    std::cout << s.Length() << ' ';
    s += "a";
    std::cout << s.Length() << ' ';

    std::cin.get();
    return 0;
}

Спасибо.......

Полностью с тобой согласен что ввыше описанной конструкции будет три нуля......  Просто это не затрагивало вопрос ...... А вот за 
Код

Buffer += '\0';

Огромное спасибо..... В VCL я вот так делаю 100% работает....
Код

Buffer.SetLength(Buffer.Length()+1);

А вот std::string опыта работы мало......




Автор: 586 25.6.2012, 10:48
Цитата(bass @  25.6.2012,  11:36 Найти цитируемый пост)
Полностью с тобой согласен что ввыше описанной конструкции будет три нуля......

В какой конструкции? В моей? Откуда три нуля то???

Автор: bass 25.6.2012, 11:25
Цитата(586 @ 25.6.2012,  10:48)
Цитата(bass @  25.6.2012,  11:36 Найти цитируемый пост)
Полностью с тобой согласен что ввыше описанной конструкции будет три нуля......

В какой конструкции? В моей? Откуда три нуля то???

Нет в вот этой.......

Код

String Buffer = "bla bla\0\0";

Автор: volatile 26.6.2012, 01:01
 smile 
Цитата(bass @  25.6.2012,  10:36 Найти цитируемый пост)
В VCL я вот так делаю 100% работает....
Buffer.SetLength(Buffer.Length()+1);

Работает до поры до времени...
http://docwiki.embarcadero.com/VCL/2010/en/System.AnsiStringBase.SetLength
Цитата

Existing characters in the string are preserved, but the content of newly allocated space is undefined

 smile 


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)