Указатели персонажей (выделено новым) - PullRequest
1 голос
/ 19 сентября 2011

Я написал следующий код:

char *pch=new char[12];
char *f=new char[42];
char *lab=new char[20];
char *mne=new char[10];
char *add=new char[10]; 

Если изначально я хочу, чтобы эти массивы были нулевыми, я не могу сделать это:

*lab="\0";
*mne="\0";
and so on.....

И после этого, если я хочу добавить некоторую строку в пустой массив, я не могу проверить:

 if(strcmp(lab,"\0")==0)
 //then add cstring by *lab="cstring";

И если я не могу сделать что-либо из этого, пожалуйста, скажите мне правильный способ сделать это ...

Ответы [ 3 ]

3 голосов
/ 20 сентября 2011

В C ++ 11 простой способ инициализации массивов заключается в использовании инициализаторов скобок:

char * p = new char[100] { 0 };

Причина заключается в том, что все отсутствующие элементы массива будут инициализироваться нулями.Вы также можете использовать явную инициализацию значения (я думаю, что это даже разрешено в C ++ 98/03), что является нулевой инициализацией для примитивных типов:

char * q = new char[110]();
1 голос
/ 20 сентября 2011

Прежде всего, как говорит DeadMG, правильный способ сделать это - использовать std:string:

std::string lab; // empty initially, no further initialization needed

if (lab.size() == 0) // string empty, note, very fast, no character comparison
    lab += "cstring"; // or even lab = "cstring", as lab is empty

Кроме того, в вашем коде, если вы настаиваете на использовании строк C, после инициализации правильная проверка для пустой строки будет

if (*lab == '\0')
0 голосов
/ 01 июня 2012

Прежде всего, я согласен со всеми остальными использовать std::string вместо массивов символов в подавляющем большинстве случаев.Ссылка для справки здесь: Библиотека C ++ Strings

Теперь, чтобы прямо ответить и на ваш вопрос:

*lab="\0";
*mne="\0";
and so on.....

Это неправильно.Предполагая, что ваш компилятор не выдает ошибку, вы не присваиваете «нулевой терминатор» этим массивам, вы пытаетесь присвоить значение указателя, где строка "\0" находится в первых нескольких местах памяти, гдеchar * указывает на!Помните, что ваши переменные - это указатели, а не строки.Если вы пытаетесь просто поставить нулевой символ в начале, чтобы strlen или другие функции C-строки видели «пустую» строку, сделайте следующее: *lab='\0'; Разница в том, что с одиночными тикамиобозначает символ \0, тогда как с двойным, это строковый литерал, который возвращает указатель на первый элемент.Надеюсь, это имело смысл.

Теперь, во-вторых, вы не можете просто так "назначить" строки в стиле C.Вам нужно поместить каждый символ в массив и правильно завершить его.Обычно самый простой способ - с помощью sprintf:

sprintf(lab, "%s", "mystring");

Это может не иметь особого смысла, тем более что я не разыменую указатель, но я проведу вас по нему,Первый аргумент говорит sprintf «выводить ваши символы туда, куда указывает этот указатель».Так что нужен необработанный указатель.Вторая строка формата, как printf использует.Поэтому я говорю использовать первый аргумент в качестве строки.И третий - то, что я хочу там, указатель на другую строку.Этот пример также будет работать с sprintf(lab, "mystring").

Если вы хотите заняться обработкой строк в стиле C, вам нужно прочитать несколько примеров.Боюсь, я даже не знаю, где искать в сети хорошие примеры этого, но я желаю вам удачи.Я настоятельно рекомендую вам проверить библиотеку строк C ++ и тип basic_string<> там.Это typedef'd для просто std :: string, и это то, что вы должны использовать.

...