Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/40: Рейтинг темы: голосов - 40, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 15.07.2009
Сообщений: 6

Копирование из char* в AnsiString

28.12.2009, 16:50. Показов 8250. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется AnsiString S, char* C (большого размера массив), и int L - длинна слова в массиве C.
Надо записать в строку S из строки C слово длинной L.

Можно сделать вот так:
S = (AnsiString) C; и спрашивается в чём вопрос, но!!!

Нигде не могу найти ответ на вопрос что происходит копирование или присваивание.
Если происходит копирование, то S и C никак не связаны, т.е. происходит копирование информации из массива в массив строки (ведь у AnsiString есть массив). Если происходит присваивание, то массив строки S будет заменён на массив С. В первом случае необходимо удалять C, а во втором удалять нельзя.
В случае копирования надо сделать так:

C++
1
2
3
4
char* C = new char[1000];
loadToChar(C, "abcdef");
S = (AnsiString) C;
delete C;
если происходит замена, то:


C++
1
2
3
char* C = new char[1000];
loadToChar(C, "abcdef");
S = (AnsiString) C;
где loadToChar(...) - некоторая функция копирования текста из потока в массив char*.

Как правильно поступить?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.12.2009, 16:50
Ответы с готовыми решениями:

AnsiString в Char
Как строку AnsiString перенести в массив char?

Ansistring в unsigned char
Как из AnsiString перевести в unsigned char определенной длины? unsigned char inBuf; хочу присвоить ему данные из Edit.

Массив char в AnsiString
Здравствуйте. Пишу на 6ом билдере. Столкнулся со следующей проблемой. Есть некий массив символов: const count = 20; char *array = new...

13
 Аватар для Ex_Soft
213 / 107 / 15
Регистрация: 28.01.2009
Сообщений: 481
28.12.2009, 16:57
Конечно же происходит копирование. Юзайте:
Цитата Сообщение от help
__fastcall AnsiString(const char* src, unsigned int len);
и не переймайтесь...
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
28.12.2009, 16:59
вот так можно скопировать заданное число символов из символьного массива в строку AnsiString:
C++
1
2
3
4
  char* t = "dsfdsfsd";
  AnsiString tt = AnsiString(t, 3);
  delete [] t;
  ShowMessage(tt);
0
0 / 0 / 0
Регистрация: 15.07.2009
Сообщений: 6
28.12.2009, 16:59  [ТС]
Спасибо.
0
 Аватар для Ex_Soft
213 / 107 / 15
Регистрация: 28.01.2009
Сообщений: 481
28.12.2009, 17:05
Цитата Сообщение от Lord_Voodoo Посмотреть сообщение
C++
1
2
  char* t = "dsfdsfsd";
  AnsiString >>>tt = AnsiString(t, 3)<<<;
Зачем рожать лишний объект???
C++
1
2
3
4
5
  char
    *t="dsfdsfsd";
 
  AnsiString
    tt(t,3);
Цитата Сообщение от Lord_Voodoo Посмотреть сообщение
C++
1
2
3
  >>>char* t = "dsfdsfsd"<<<;
  ...
  >>>delete [] t<<<;
?
0
0 / 0 / 0
Регистрация: 15.07.2009
Сообщений: 6
28.12.2009, 17:21  [ТС]
Зачем рожать лишний объект???
Мне тоже интересно. У меня AnsiString - это элемент некоторого struct. Но иногда приходиться экземпляр этой структуры обновлять, желательно именно переписывать строку (которая уже есть), а не заменять новым объектом.

Добавлено через 5 минут
__fastcall AnsiString(const char* src, unsigned int len);
Это как я понимаю создание нового объекта.
0
 Аватар для Ex_Soft
213 / 107 / 15
Регистрация: 28.01.2009
Сообщений: 481
28.12.2009, 17:27
При визуализации тэга [ quote ] указывается, если определен, автор цитаты. Обычно, кого цитируют - к тому и обращаются.

Добавлено через 5 минут
Цитата Сообщение от OpenMan Посмотреть сообщение
__fastcall AnsiString(const char* src, unsigned int len);
Это как я понимаю создание нового объекта
Да. Это - один из конструкторов AnsiString. Вы разницу между:
C++
1
2
3
4
5
6
char
    *t="dsfdsfsd";
 
  AnsiString
    tt1=AnsiString(t,3),
    tt2(t,3);
улавливаете?
0
0 / 0 / 0
Регистрация: 15.07.2009
Сообщений: 6
28.12.2009, 17:54  [ТС]
Цитата Сообщение от Ex_Soft Посмотреть сообщение
улавливаете?
Видемо нет, т.е. не улавливаю. Скажу даже больше, мне она раньше не встречалась.

C++
1
2
3
4
5
6
7
8
9
10
struct SC{
AnsiString string;
.... // другие элементы структуры
void setString(char* _c, int _len);
 
};
 
void SC::setString(char* _c, int _len){
  AnsiString string(_c,_len); 
}
Вот так типа правильно, чтобы не создавать новых объектов?

Добавлено через 1 минуту
"Она" - это конструкция.

Добавлено через 14 минут
Я надеюсь, что мне объяснят разницу, ну в крайнем случае пошлют на что-нибудь русское.
0
 Аватар для Ex_Soft
213 / 107 / 15
Регистрация: 28.01.2009
Сообщений: 481
28.12.2009, 17:55
/me думает: "...смешались в кучу кони люди..." OpenMan, мой вопрос был обращен не Вам.
В Вашем же конкретном случае
Цитата Сообщение от OpenMan Посмотреть сообщение
C++
1
2
3
void SC::setString(char* _c, int _len){
  >>>AnsiString<<< string(_c,_len); 
}
Вы вообще рожаете локальную переменную.

Цитата Сообщение от OpenMan Посмотреть сообщение
объяснят разницу
разницу в чем?
0
0 / 0 / 0
Регистрация: 15.07.2009
Сообщений: 6
28.12.2009, 18:01  [ТС]
Цитата Сообщение от Ex_Soft Посмотреть сообщение
разницу в чем?
Разницу между
C++
1
2
  
AnsiString tt1=AnsiString(t,3);
и
C++
1
2
  
AnsiString tt2(t,3);
0
 Аватар для Ex_Soft
213 / 107 / 15
Регистрация: 28.01.2009
Сообщений: 481
28.12.2009, 18:23
C++
1
2
  
AnsiString tt1=AnsiString(t,3);
1. Вызывается __fastcall AnsiString(const char* src, unsigned int len)
2. Вызывается AnsiString& __fastcall operator =(const AnsiString& rhs) с аргументом объектом, созданным в п 1.
C++
1
2
  
AnsiString tt2(t,3);
1. Вызывается __fastcall AnsiString(const char* src, unsigned int len);
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
29.12.2009, 08:57
Цитата Сообщение от Ex_Soft Посмотреть сообщение
>
>>char* t = "dsfdsfsd"<<<; ...
>>>delete [] t<<<; ?
показал, что идет копирование данных, а не присваивание указателей... а на счет первого - честно говоря, всегда пишу так, буду знать, что можно проще...

Ex_Soft, и раз уж вы туту ликбез устроили, может и мне расскажете, почему такое объявление массива символов никак не реагирует на delete?
0
 Аватар для Ex_Soft
213 / 107 / 15
Регистрация: 28.01.2009
Сообщений: 481
29.12.2009, 10:17
Цитата Сообщение от Lord_Voodoo Посмотреть сообщение
а на счет первого
Признаюсь - тут я немного переоволновался:
C++
1
2
AnsiString
  a=AnsiString("123456789",3);
и
C++
1
2
AnsiString
  a("123456789",3);
Абсолютно эквавалентны. А, вот, в случае:
C++
1
2
3
4
AnsiString
  a;
 
a=AnsiString("123456789",3);
Действительно создается промежуточный объект.
Цитата Сообщение от Lord_Voodoo Посмотреть сообщение
почему такое объявление массива символов никак не реагирует на delete?
тынць
C++
1
char* t = "dsfdsfsd";
Это не объявление массива, а объявление с инициализацией указателя на char. Вот смотрите:
C++
1
2
3
char
  Array[SIZE], //объявление массива
  *CharPtr; // объявление указателя на char
Далее указателю на char присваивается адрес строковой константы, расположенной с статической области и которая сама по себе является указателем на себя же саму:
C
1
printf("%s, %u, %c\n","First","Second",*"Third");
т.е.
C++
1
t="dsfdsfsd";
В итоге объявление с инициализацией
C++
1
char* t = "dsfdsfsd";
equ
C++
1
2
3
4
char
  *t;
 
t="dsfdsfsd";
Как видите - нигде никакого выделения памяти не происходит, соответственно и удалять нечего.
1
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
29.12.2009, 10:30
Ex_Soft, век живи - век учись, мало работаю с массивами символов, поэтому многих нюансов пока не знаю
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.12.2009, 10:30
Помогаю со студенческими работами здесь

Преобразование AnsiString в char
Есть следующий код: AnsiString s; char *str; //strcpy(str,s.c_str()); fprintf (f,s.c_str()); В...

Проблема с перекодировкой AnsiString in CHAR
Добрый день! Может кто сталкивался с такой проблемой - необходимо перевисти введенную строку (строка около 50 символов) из AnsiString в...

Как перевести из AnsiString в char?
Помогите, пожалуйста... Например если я пишу: val=Edit1-&gt;Text; Как перевести из AnsiString в char? Именно в char, а не в *char При...

Строки AnsiString и массив char
void __fastcall TForm1::Button1Click(TObject *Sender) { char* memo1; char* memo2; char* memo12; int im1 =...

Преобразовать AnsiString в массив char
Здравствуйте программисты. Недавно у меня возникла необходимость воспользоваться классом для работы с файлами fstream. Но проблема в том...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Киев стоит - украинская песня
zorxor 28.01.2026
wfWdiRqdTxc О Господи, Вечный, Ты . . . Я помоги, Бесконечный. . . Я прошу Ты. . . Я погибаю, спаси. . . Я прошу Тебя Вечный. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru