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

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

11.08.2016, 00:02. Показов 15542. Ответов 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 / 1575 / 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 / 1575 / 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 / 1575 / 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 / 1575 / 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
Ответ Создать тему
Новые блоги и статьи
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru