Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.77/64: Рейтинг темы: голосов - 64, средняя оценка - 4.77
6 / 6 / 7
Регистрация: 07.08.2016
Сообщений: 44

В чём разница между string и символьными массивами?

11.08.2016, 00:02. Показов 15553. Ответов 64
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собсна какая тема, такой и вопрос. Если выразить его по-точнее, то в чём существенные плюсы того и другого в разных ситуациях? Изучаю С++ и, естественно, столкнулся с символами и строками. Что лучше в какой ситуации и в чём их главное различие не совсем понимаю.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.08.2016, 00:02
Ответы с готовыми решениями:

В чем разница между этими массивами?
const char *names = {"Ivanov", "Petrov", "Sidorov"}; const char **names = {"Ivanov", "Petrov", "Sidorov"}; Добавлено через 8...

В чем принципиальная разница между массивами в VBScript и JavaScript?
Народ, объясните, пож., в чем принципиальная разница между массивами в VBScript и JavaScript? Проблема в том, что при передаче...

В чем разница между string и String?
В чем разница между string и String с заглавной буквы? :pardon:

64
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
11.08.2016, 13:50
Студворк — интернет-сервис помощи студентам
obivan, Тьфу блин, ссылку не увидел.
0
88 / 84 / 31
Регистрация: 18.11.2013
Сообщений: 390
11.08.2016, 13:52
Цитата Сообщение от Toshkarik Посмотреть сообщение
везде, где нужен char*, можно передать &string[0], будет то же самое
тут что не так?

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
c_str который возвращает адрес буфера.
верно подметили, c_str() возвращает const char*, и я не говорил, что его можно изменять
простите, забыл const
без const будет &string[0]

avgoor, Возникнет, так как там есть значок &
а это значит, что передаётся по ссылке, а это значит, что нужен объект такого же типа
0
11.08.2016, 13:52

Не по теме:

Цитата Сообщение от avgoor Посмотреть сообщение
obivan, Тьфу блин, ссылку не увидел.
;), кстати не по теме, не подскажете как на рекстестер ссылку кидать, там код проверил он не скомпилился хотел скинуть но просто отправилась офф ссылка на сайт

0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
11.08.2016, 13:56
obivan, save it -> вводите какое-нибудь имя -> "Ура все получилось"

Добавлено через 2 минуты
Цитата Сообщение от Krock21rus Посмотреть сообщение
avgoor, Возникнет, так как там есть значок &
а это значит, что передаётся по ссылке, а это значит, что нужен объект такого же типа
Цитата Сообщение от avgoor Посмотреть сообщение
obivan, Тьфу блин, ссылку не увидел.
Я буду всегда обновлять страницу перед отправкой комментария
1
 Аватар для Babysitter
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
11.08.2016, 14:00
Цитата Сообщение от obivan Посмотреть сообщение
может быть зависит от компилятора, но все таки стоит предостерегатся, vc++ не принимает точно
с константной ссылкой должно работать.

http://rextester.com/CJOUT38837
0
88 / 84 / 31
Регистрация: 18.11.2013
Сообщений: 390
11.08.2016, 14:00
avgoor, слишком быстро пишите комментарии
0
Падаван С++
 Аватар для obivan
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
11.08.2016, 14:02
Babysitter, ну так то да ))) я же на это и указал чтобы тс потом не спрашивал а почему не работает, я ж в коменте своем писал что нужно константную ссылку
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
11.08.2016, 14:37
Цитата Сообщение от avgoor Посмотреть сообщение
Почему?
Цитата Сообщение от Krock21rus Посмотреть сообщение
тут что не так?
Хотя бы потому, что для ввода/вывода std::string есть перегруженные функции в той же stl. Использовать для этого scanf - нонсенс.

Добавлено через 12 минут
Плюс ко всему, если в строку размером 10 символов записать слово размером в 5, то std::string::size() вернет все равно 10. И после этого будет выводить неверную строку. Попробуйте вот такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
int main() {
   std::string str = "123456789";
 
   std::cout << str << ' ' << str.size() << ' ' << strlen( str.c_str() ) << std::endl;
 
   std::scanf( "%s", &str[ 0 ] );
 
   std::cout << str << ' ' << str.size() << ' ' << strlen( str.c_str() ) << std::endl;
 
   return 0;
}
Введите, скажем, 12345. Удивитесь.
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
11.08.2016, 14:40
Цитата Сообщение от Toshkarik Посмотреть сообщение
Причем, если верить справочнику, она не обязана возвращать указатель на внутренний буфер.
Она в принципе может вернуть указатель на буфер копии а не на свой.
Там принцип другой немного. буфера с рефкаунтингом. если буфер константный создается копия и возвращается указатель на ее буффер. Так же может из стринглиста копии возвращать. там буфер общий для всех входящих в него строк. и нули где ни попадя расставлять нельзя
Цитата Сообщение от Toshkarik Посмотреть сообщение
Который есть только в borland,
При прямых руках он и для других компиляторов делается. самое ходовое - пол часа, за два часа все что там вообще у борланда есть в наборе слепить можно. Если только ее функциий как строки касаться. с толковым стринглистом конечно чуток подольше повозится придется.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
11.08.2016, 14:43
Цитата Сообщение от Toshkarik Посмотреть сообщение
Хотя бы потому, что для ввода/вывода std::string есть перегруженные функции в той же stl
Нельзя что-то использовать, потому что есть что-то другое, лучшее, более соответствующее линии партии?

Тогда вопрос. Допустим, есть библиотека с сишным интерфейсом. В часности, там есть функция, которая принимает указатель на строку. Как мы ее прикрутим к нашему проекту? В обертке будем выделять дополнительный буфер, а затем копировать из него в string? Зачем, если стандарт разрешает передать туда внутренний буфер стринга? Причем, одни и те же проблемы (с сырой памятью) есть в обоих подходах.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
11.08.2016, 14:44
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
При прямых руках он и для других компиляторов делается. самое ходовое - пол часа, за два часа все что там вообще у борланда есть в наборе слепить можно. Если только ее функциий как строки касаться. с толковым стринглистом конечно чуток подольше повозится придется.
При прямых руках используется std::string, а не изобретаются велосипеды.
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Она в принципе может вернуть указатель на буфер копии а не на свой.
Зачем повторять мои слова?
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
11.08.2016, 14:45
Цитата Сообщение от Toshkarik Посмотреть сообщение
Плюс ко всему, если в строку размером 10 символов записать слово размером в 5
И правильно сделает. Вопрос: вот так можно сделать?
C++
1
2
std::string s="12345";
s[1]='\0';
Что вернет s.length()?
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
11.08.2016, 14:46
Цитата Сообщение от avgoor Посмотреть сообщение
В обертке будем выделять дополнительный буфер, а затем копировать из него в string?
Именно так.
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
11.08.2016, 14:47
Цитата Сообщение от Toshkarik Посмотреть сообщение
При прямых руках используется std::string, а не изобретаются велосипеды.
Это std::string и есть тормознутый велосипед, непригодный для серьезных дел. Начнем с того что AnsiString и StringList гораздо раньше STD появились
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
11.08.2016, 14:51
Добавлено через 4 минуты
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Это std::string и есть тормознутый велосипед,
На этом я прекращаю дискуссию с Вами.
Цитата Сообщение от avgoor Посмотреть сообщение
Что вернет s.length()?
1, потому что она ничего не знает о классе string, так же, как и scanf, после которой пользователь должен ручками изменять размер string.
Цитата Сообщение от avgoor Посмотреть сообщение
если стандарт разрешает передать туда внутренний буфер стринга
И разрешает его менять без последствий, отслеживая изменения размера, которые ожидает пользователь? read-only - пожалуйста, пользуйтесь.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
11.08.2016, 14:58
Цитата Сообщение от Toshkarik Посмотреть сообщение
Именно так.
Ваше дело. Только объясните поему нельзя, например, так:
C++
1
2
3
4
5
6
7
8
9
10
11
const size_t MAX_DLL_STR = 0x100;
 
void func_from_dll(char *str, size_t n);
 
std::string string_from_dll()
{
    std::string s(MAX_DLL_STR + 1, '\0');
    func_from_dll(&s[0], MAX_DLL_STR);
    s.resize(strlen(&s[0]));
    return s;
}
После c++17 вместо &s[0] надо будет использовать s.data().
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
11.08.2016, 15:05
Цитата Сообщение от Toshkarik Посмотреть сообщение
И разрешает его менять без последствий, отслеживая изменения размера, которые ожидает пользователь?
Если пользователь пряморукий то отследит как положенно если изменять будет.
Цитата Сообщение от Toshkarik Посмотреть сообщение
На этом я прекращаю дискуссию с Вами.
Мысль о том что существуют тулсы поудобнее и сделанные гораздо пограмотнее stl кажется Вам в принципе крамольной? stl устарела лет на 20 даже на момент своего появления. концепция ее устарела.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
11.08.2016, 15:11
Пишите, пожалуйста. Спорить можно бесконечно. Можно хотя бы сказать про то, что только в c++11 std::string обязан хранить данные в целом куске памяти. При это нигде нет ни слова, что можно или одобряется запись напрямую в буфер, потому что никому такое в голову прийти не могло.
Автор и другие участники, которых заинтересовал данный вопрос, сделают для себя выводы.
Цитата Сообщение от avgoor Посмотреть сообщение
После c++17 вместо &s[0] надо будет использовать s.data().
До его выхода может многое измениться. Немало того, что практически одобрили при разработки c++11 на выходе просто выкинули.

PS:
C++
1
2
3
4
5
6
7
8
std::string string_from_dll()
{
    char buff[ MAX_DLL_STR ];
 
    func_from_dll( buff, MAX_DLL_STR);
   
    return std::string( buff );
}
Будет намного эффективней и безопасней.

Добавлено через 3 минуты
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Мысль о том что существуют тулсы поудобнее и сделанные гораздо пограмотнее stl кажется Вам в принципе крамольной? stl устарела лет на 20 даже на момент своего появления. концепция ее устарела.
Это Ваше ничем необоснованное мнение, именно поэтому я не буду это обсуждать.
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
11.08.2016, 15:17
Цитата Сообщение от Toshkarik Посмотреть сообщение
Это Ваше ничем необоснованное мнение, именно поэтому я не буду это обсуждать
Обоснованное в первую очередь требованиями по надежности софта. Если внутри либы сборник говнокода как в STL то она в принципе ненадежна. Мало того она не решает ни одной из ходовых задач и не имеет для этого абсолютно никаких пригодных заготовок.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
11.08.2016, 15:22
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Обоснованное в первую очередь требованиями по надежности софта. Если внутри либы сборник говнокода как в STL то она в принципе ненадежна. Мало того она не решает ни одной из ходовых задач и не имеет для этого абсолютно никаких пригодных заготовок.
Какими еще требованиями? Кроме Ваших слов я ничего больше не увидел. Это называется голословность. Тоже самое я могу сказать про Ваш AnsiString или любую другую библиотеку/класс, которую Вы приведете в пример.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.08.2016, 15:22

В чем разница между массивом строк и List<string>?
А есть ли принципиальная разница между string array1 и List&lt;string&gt; array2 ? И если есть, то в чем она заключается?

В чем разница между new ArrayList<String>() и new ArrayList<>()?
подскажите,знатоки,в чем разность между ArrayList &lt;String&gt; stringList = new ArrayList&lt;String&gt;(); и ArrayList &lt;String&gt;...

В чём разница между возвратом "string" и "const string&" &
class test { public: test(const string&amp; text) { this-&gt;text = text; } string getText() { return text;

Разница между массивами объектов
Столкнулся с ситуацией, что в ArrayList &lt;SomeClass&gt; нельзя записать метод из класса если он void, в обычный массив метод класса с void...

Разница между многомерными и зубчатыми массивами
Только недавно начал изучать. Не судите строго. Если мне нужно создать матрицу, то многомерные массивы имеют какое-то преимущество над...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
SUNO Ai - Река Без Дна
zorxor 31.07.2026
Автор стихотворения - астрофизик Марина Катыс Ссылка на сгенерированную музыкальную композицию: https:/ / suno. com/ song/ 6f6e5464-b290-4650-be6c-44c85f8d8013 Я говорю, что Время- как вода течет. . .
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru