Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> char*, очистить 
:(
    Опции темы
lv151
Дата 16.7.2009, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 916
Регистрация: 11.2.2008

Репутация: нет
Всего: 2



как правильно  очистить char*?
т.е. чтобы все элементы были "" или '\0'.
PM MAIL   Вверх
zim22
Дата 16.7.2009, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(lv151 @  16.7.2009,  11:38 Найти цитируемый пост)
как правильно  очистить char*?

указатель на char очищается так:
Код

char *name = "Hello";
name = NULL;


Цитата(lv151 @  16.7.2009,  11:38 Найти цитируемый пост)
т.е. чтобы все элементы были "" или '\0'.

все элементы? массив указателей на char что-ли?
Код

char *arr[] = { "Hello", "my", "dear", "friend" };

for (int i = 0; i != sizeof(arr) / sizeof(*arr); ++i)
  arr[i] = NULL;

***
или так:
Код

char *arr[] = { "Hello", "my", "dear", "friend" };
memset(arr, 0, sizeof(char*) * (sizeof(arr) / sizeof(*arr)));


Это сообщение отредактировал(а) zim22 - 16.7.2009, 11:55


--------------------
PM MAIL   Вверх
Леопольд
Дата 16.7.2009, 13:06 (ссылка)   | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(zim22 @ 16.7.2009,  11:47)
Цитата(lv151 @  16.7.2009,  11:38 Найти цитируемый пост)
как правильно  очистить char*?

указатель на char очищается так:
Код

char *name = "Hello";
name = NULL;

Не совсем. Это не просто указатель на char а "строковой литерал". name = NULL; - просто перетирает значение указателя и он больше не указывает на область памяти, в которой "лежит" литерал.
Присваивание строковому литералу - undefined behaviour. Т.е. вот так делать нельзя:
Код

char *name = "Hello";
name[0] = '\0';

http://www.cplusplus.com/forum/beginner/11740/

lv151

Если можно пользоваться STL то лучше пользуйся std::string и std::vector
Код

#include <string>
#include <vector>

void print_vector(std::vector<std::string>& v){
    typedef std::vector<std::string>::size_type size_type; //обычно, это то же самое что и size_t
    for(size_type i = 0; i < v.size(); ++i)
        std::cout<<v[i]<<" ";
    std::cout<<std::endl;
}

int main() {
    std::vector<std::string> arr;
    arr.push_back("Hello,");
    arr.push_back("my");
    arr.push_back("dear");
    arr.push_back("friend");
    print_vector(arr);

    arr.erase(arr.begin() + 2); //удалить третий элемент
    print_vector(arr);

    arr.insert(arr.begin() + 2, "real"); //вставить перед третьим элементом
    print_vector(arr);

    arr[2] = "empty"; //тут понятно без комментариев
    print_vector(arr);
}



Это сообщение отредактировал(а) Леопольд - 16.7.2009, 13:12


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
mrbrooks
Дата 16.7.2009, 13:08 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306



Леопольд, это все замечательно - но если автор имеет ввиду просто С?
PM MAIL   Вверх
zim22
Дата 16.7.2009, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Леопольд @  16.7.2009,  13:06 Найти цитируемый пост)
Присваивание строковому литералу - undefined behaviour. Т.е. вот так делать нельзя

Код

char *name = "Hello";
name[0] = '\0';

я знаю что так делать нельзя. где я так делал?
Цитата(Леопольд @  16.7.2009,  13:06 Найти цитируемый пост)
Не совсем. Это не просто указатель на char а "строковой литерал"

нет. это указатель на константный строковый литерал.


Это сообщение отредактировал(а) zim22 - 16.7.2009, 13:18


--------------------
PM MAIL   Вверх
Леопольд
Дата 16.7.2009, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(mrbrooks @ 16.7.2009,  13:08)
Леопольд, это все замечательно - но если автор имеет ввиду просто С?

Тут уже надо уточнить у топикпастера.

Добавлено @ 13:17
Цитата(zim22 @ 16.7.2009,  13:12)
...
я знаю что так делать нельзя. где я так делал?

Я и не говорю что ты так делал. А вот lv151 хочет сделать так, сюдя по его вопросу...

Цитата(zim22 @ 16.7.2009,  13:12)
...
Цитата(Леопольд @  16.7.2009,  13:06 Найти цитируемый пост)
Не совсем. Это не просто указатель на char а "строковой литерал"

нет. это указатель на строковый литерал.

Так будет правильнее, не спорю...

Это сообщение отредактировал(а) Леопольд - 16.7.2009, 13:19


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
mes
Дата 16.7.2009, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Леопольд @  16.7.2009,  12:06 Найти цитируемый пост)
Присваивание строковому литералу - undefined behaviour. Т.е. вот так делать нельзя:

поэтому везде где можно, нужно объявлять как указатель на константу (const char *)

Цитата(zim22 @  16.7.2009,  12:12 Найти цитируемый пост)
я знаю что так делать нельзя. где я так делал?

как я понял, это пояснение Леопольд давал для автора, чтоб он такого не захотел сделать smile

Добавлено через 38 секунд
опоздал.. smile


--------------------
PM MAIL WWW   Вверх
Леопольд
Дата 16.7.2009, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(zim22 @ 16.7.2009,  13:12)
нет. это указатель на константный строковый литерал.

По моему, некоторые компиляторы позволяют такое присваивание. Другие, тоже скомпилируют этот код, но будет ошибка на этапе выполнения, потому что неконстантный строковой литерал будет "лежать" в readonly области. А если использовать char const* lit = "literal" то программа не скомпилируется. О чём уже упомянул mes.

Это сообщение отредактировал(а) Леопольд - 16.7.2009, 13:27


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
mes
Дата 16.7.2009, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Леопольд @  16.7.2009,  12:24 Найти цитируемый пост)
По моему, некоторые компиляторы позволяют присваивание по char* lit = "literal". 

насколько я слышал, все - из за обратной совместимости с *гладким Си. smile

P.S. *plain C.


Это сообщение отредактировал(а) mes - 16.7.2009, 13:29


--------------------
PM MAIL WWW   Вверх
zim22
Дата 16.7.2009, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Леопольд @  16.7.2009,  13:24 Найти цитируемый пост)
По моему, некоторые компиляторы позволяют такое присваивание

Цитата(mes @  16.7.2009,  13:18 Найти цитируемый пост)
поэтому везде где можно, нужно объявлять как указатель на константу (const char *)




--------------------
PM MAIL   Вверх
Леопольд
Дата 16.7.2009, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(Леопольд @ 16.7.2009,  13:14)

... А вот lv151 хочет сделать так, сюдя по его вопросу...

Хотя нет, он ведь не объявлял строковой литерал. Он просто спросил как "очистить" char*. Может он память динамически выделил. В общем, вопрос задан плохо, надо задавать уточняющие вопросы. Если я правильно его понял, ему надо сделать что-то вроде этого:
Код

    char* str = new char[length];
    *str = '\0';


Это сообщение отредактировал(а) Леопольд - 16.7.2009, 13:38


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0609 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.