Форум программистов, компьютерный форум CyberForum.ru

Как преобразовать переменную string в массив char[]? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 287, средняя оценка - 4.63
nill
9 / 9 / 0
Регистрация: 16.08.2009
Сообщений: 417
03.02.2012, 13:42     Как преобразовать переменную string в массив char[]? #1
Есть переменная string и массив char как записать переменную типа string в такой массив ?

C++
1
2
String X="test";
char Mass[100];
Нужен максимально простой и короткий пример!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.02.2012, 13:42     Как преобразовать переменную string в массив char[]?
Посмотрите здесь:

есть массив char. есть строка string. как присвоить значению string-a значение char-a? C++
C++ не получается преобразовать дату(как массив типа char) в число...
Как преобразовать char в string C++
C++ Перевести массив char в переменную string
C++ TinyXML. Преобразовать TiXmlElement в TiXmlString, char[] или string
Преобразовать string в массив char C++
C++ Как преобразовать string в char*?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
diagon
Higher
 Аватар для diagon
1921 / 1187 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
03.02.2012, 13:44     Как преобразовать переменную string в массив char[]? #2
C++
1
strcpy( Mass, X.c_str() );
Но это для STL'овского std::string. Что такое String, я не знаю.
nill
9 / 9 / 0
Регистрация: 16.08.2009
Сообщений: 417
03.02.2012, 13:54  [ТС]     Как преобразовать переменную string в массив char[]? #3
diagon,

неработает

error C2664: strcpy: невозможно преобразовать параметр 1 из 'const char *' в 'char *'

Но это для STL'овского std::string. Что такое String, я не знаю.
да я ошибся надо писать string с маленькой буквы но это ничего не меняет код не работает
diagon
Higher
 Аватар для diagon
1921 / 1187 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
03.02.2012, 13:55     Как преобразовать переменную string в массив char[]? #4
Я там аргументы местами перепутал, потом исправил.
nill
9 / 9 / 0
Регистрация: 16.08.2009
Сообщений: 417
03.02.2012, 14:06  [ТС]     Как преобразовать переменную string в массив char[]? #5
diagon,

сработало!
а как в конце вставить символ завершения строки \0 ?
в массиве char
diagon
Higher
 Аватар для diagon
1921 / 1187 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
03.02.2012, 14:10     Как преобразовать переменную string в массив char[]? #6
Цитата Сообщение от nill Посмотреть сообщение
diagon,
сработало!
а как в конце вставить символ завершения строки \0 ?
в массиве char
Если использовать strcpy, то он сам поставится.
При инициализации можно ставить так:
C++
1
char Mass[100] = "\0";
Либо так
C++
1
char Mass[100] = "";
go
Эксперт C++
3584 / 1364 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
03.02.2012, 14:12     Как преобразовать переменную string в массив char[]? #7
nill, а разве его там нет?

Добавлено через 1 минуту
diagon, strcpy плохая функция. Лучше использовать strncpy, а перед ней
C++
1
memset(buf, 0, sizeof(buf));
diagon
Higher
 Аватар для diagon
1921 / 1187 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
03.02.2012, 14:24     Как преобразовать переменную string в массив char[]? #8
Цитата Сообщение от go Посмотреть сообщение
diagon, strcpy плохая функция. Лучше использовать strncpy
Смешивать string и cstring вообще плохая затея. А с strcpy самый простой вариант, как и просил ТС.
А memset-то зачем?
Тогда уж так
C++
1
strncpy( Mass, X.c_str(), X.length() + 1 );
go
Эксперт C++
3584 / 1364 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
03.02.2012, 14:26     Как преобразовать переменную string в массив char[]? #9
Цитата Сообщение от diagon Посмотреть сообщение
Тогда уж так
К сожалению, так не нужно. Теряется смысл в использовании этой функции, и возникает возможность переполнения буфера, необходимо так
C++
1
2
3
memset(buf, 0, sizeof(buf));
 
strncpy(buf, str.c_str(), sizeof(buf) - 1);
diagon
Higher
 Аватар для diagon
1921 / 1187 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
03.02.2012, 14:36     Как преобразовать переменную string в массив char[]? #10
Цитата Сообщение от go Посмотреть сообщение
К сожалению, так не нужно. Теряется смысл в использовании этой функции, и возникает возможность переполнения буфера, необходимо так
C++
1
2
3
memset(buf, 0, sizeof(buf));
 
strncpy(buf, str.c_str(), sizeof(buf) - 1);
А в чем смысл заполнения всего буфера нулями?
От переполнения это вроде как не спасет.
А если str.c_str() кончится раньше, чем sizeof(buf) - 1, то оставшееся место должно просто забиться нулями.
go
Эксперт C++
3584 / 1364 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
03.02.2012, 14:44     Как преобразовать переменную string в массив char[]? #11
Сначала обнуляем буфер, так как мы не знаем размер массива, который необходимо в него записать. Затем копируем кол-во байт, не превышающее размер буфера - 1 (для ноль-символа), во избежании выхода за пределы.
diagon
Higher
 Аватар для diagon
1921 / 1187 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
03.02.2012, 16:36     Как преобразовать переменную string в массив char[]? #12
Цитата Сообщение от go Посмотреть сообщение
Сначала обнуляем буфер, так как мы не знаем размер массива, который необходимо в него записать.
Ну, и?
Если размер записываемого массива больше, то он обрубится. Если меньше - оставшееся место просто забьется нулями.
char * strncpy ( char * destination, const char * source, size_t num );
Copy characters from string

Copies the first num characters of source to destination. If the end of the source C string (which is signaled by a null-character) is found before num characters have been copied, destination is padded with zeros until a total of num characters have been written to it.
go
Эксперт C++
3584 / 1364 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
03.02.2012, 16:44     Как преобразовать переменную string в массив char[]? #13
diagon, не совсем так...
http://liveworkspace.org/code/a022e8...15cdbafc23c541
Раскомментируйте строчку и почувствуйте разницу
http://liveworkspace.org/code/4ca42c...ded813a8ebcea2
Как вывод, вариант Как преобразовать переменную string в массив char[]? лучше подходит
retmas
Жарю без масла
831 / 713 / 156
Регистрация: 13.01.2012
Сообщений: 1,637
03.02.2012, 16:57     Как преобразовать переменную string в массив char[]? #14
Цитата Сообщение от go Посмотреть сообщение
diagon, не совсем так...
http://liveworkspace.org/code/a022e8...15cdbafc23c541
совсем так. в вашем примере, конец строки попадается одновременно с записью указанного количества символов. поэтому 0-ми не забивается(вернее, забивается 0 оставшихся элементов, что тоже самое). вот вам для размышления http://liveworkspace.org/code/267bcd...439220287fc633.
и еще раз прочитайте это
Цитата Сообщение от diagon Посмотреть сообщение
If the end of the source C string (which is signaled by a null-character) is found before num characters have been copied, destination is padded with zeros until a total of num characters have been written to it.
go
Эксперт C++
3584 / 1364 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
03.02.2012, 17:05     Как преобразовать переменную string в массив char[]? #15
retmas, вопрос стоит о том стоит ли использовать memset. И как показал мой пример, без нее не обойтись.
Цитата Сообщение от retmas Посмотреть сообщение
и еще раз прочитайте это
Я этого не отрицаю. Читайте выше о чем весь спор.
Цитата Сообщение от retmas Посмотреть сообщение
http://liveworkspace.org/code/267bcd...439220287fc633.
Ваш пример не чем не обусловлен. Я показал тот случай, где без memset не обойтись. Девять символов копируем в буфер размером 10 байт. Все верное, а результат ни тот. Почему я уже сказал.
retmas
Жарю без масла
831 / 713 / 156
Регистрация: 13.01.2012
Сообщений: 1,637
03.02.2012, 17:07     Как преобразовать переменную string в массив char[]? #16
в том случае не мемсет нужен, а простой '\0' в конец, потому что
No null-character is implicitly appended to the end of destination, so destination will only be null-terminated if the length of the C string in source is less than num.
хотя конечно, для этого и мемсет сгодится, но зачем лишняя работа?
go
Эксперт C++
3584 / 1364 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
03.02.2012, 17:09     Как преобразовать переменную string в массив char[]? #17
Цитата Сообщение от retmas Посмотреть сообщение
а простой '\0' в конец
Каким образом вы будете отлавливать его? Я написал код в общем случаем, а вы привязываетесь к какому-то примеру. Не нужно так делать...
retmas
Жарю без масла
831 / 713 / 156
Регистрация: 13.01.2012
Сообщений: 1,637
03.02.2012, 17:11     Как преобразовать переменную string в массив char[]? #18
Цитата Сообщение от go Посмотреть сообщение
Каким образом вы будете отлавливать его?
как-как? записываем number элементов. вот вам и место куда его пихать. и вполне общий случай
go
Эксперт C++
3584 / 1364 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
03.02.2012, 17:17     Как преобразовать переменную string в массив char[]? #19
Цитата Сообщение от retmas Посмотреть сообщение
записываем number элементов. вот вам и место куда его пихать. и вполне общий случай
Функцию strncpy придумали не для этого.
Если же длина строки, адресуемой параметром str2, больше значения count, то строка - результат, адресуемая параметром str1, не будет заканчиваться символом конца строки[1].
strncpy — функция стандартной библиотеки языка программирования Си, для копирования содержимого нуль-терминированной строки в буфер ограниченного размера.
Функция strncpy аналогична strcpy с защитой от переполнения буфера.
Можно ее использовать и таким образом. У Вас и вашего коллеги это не отражено.
При правильной работе с функцией, нужно передавать в функцию значение len на единицу меньше размера буфера, а также самостоятельно устанавливать последний байт в 0:
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.02.2012, 17:24     Как преобразовать переменную string в массив char[]?
Еще ссылки по теме:

C++ Как двумерный массив char заменить на string?
C++ Как преобразовать строку char в массив int?
Как преобразовать объект string в строку char*? C++
Как преобразовать char* в string и вывести переменную string на экран? C++
Не удаётся преобразовать string в char C++

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4945 / 3021 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
03.02.2012, 17:24     Как преобразовать переменную string в массив char[]? #20
go, так почему бы не установить нуль-терминатор в заранее известную позицию, что займёт одну инструкцию копирование, в отличие от memset, который заполнит нулями весь буфер?
Yandex
Объявления
03.02.2012, 17:24     Как преобразовать переменную string в массив char[]?
Ответ Создать тему
Опции темы

Текущее время: 13:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru