Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/75: Рейтинг темы: голосов - 75, средняя оценка - 4.85
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1

Инициализация строки

16.05.2016, 10:47. Показов 15180. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, такое дело: имеется инициализация
C++
1
char* str1 = "x"; // lvalue - char*, rvalue = const char[2]
такая инициализация есть темное наследие чистого Си, но вместе с этим rvalue приводится к char*

C++
1
const char str2[] = "y"; // lvalue - const char[], rvalue = const char[2]
таким образом, тип const char[] инициализируется типом char[2]

В силу последнего, можно полагать, что:
C++
1
const char str3[] = str2; // lvalue - const char[], rvalue = const char[2]
но происходит ошибка компиляции.

Можете объяснить?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.05.2016, 10:47
Ответы с готовыми решениями:

Инициализация строки - задачка
Сама задачка от Kastaneda: #include <string> #include <iostream> using namespace std; #define DEBUG( str ) do{ cout <<...

Инициализация строки и запись ее в файл
нужно написать программу, которая инициализирует какую-либо строку и записывает ее в файл test.txt, помогите, пожалуйста!)

Инициализация длинной константной строки
Нужно офомить строку в несколько строк с переводом на новую строку. char string = "nznznznznznznz r\n\\ znznnznzznznznznzn...

35
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
16.05.2016, 10:57
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Можете объяснить?
"y" - строковой литерал, str2 - просто строка. Первым массив символов инициализировать можно, вторым - нет.
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
16.05.2016, 18:23  [ТС]
Renji, а что вобще есть строковый литерал по своей сути? Ведь "строковый литерал представляет последовательность символов, которые вместе образуют строку с завершающим нулем.".

Под это определение вполне может подпадать str3. И как вобще компилятор различает, производится ли инициализация "строковым литералом", ведь по сути просто сопоставляются типы (и там, и там - const char[]) и происходит инициализация. Ведь строковый литерал имеет тип const char[]
0
 Аватар для SergioO
261 / 209 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
16.05.2016, 18:33
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
const char str3[] = str2;
str2 - это указатель. разница между char *str и char arr[] - str можно "повернуть" на что угодно, те можно указывать на другое место в памяти или вообще в никуда str = 0, но менять содержимое нельзя. в случае char arr[] с точностью до наоборот указатель arr никуда кроме своего массива указывать не может, те присвоить ему что-либо нельзя, но зато можно менять содержимое области памяти.
0
4 / 4 / 1
Регистрация: 04.04.2016
Сообщений: 23
16.05.2016, 18:43
На сколько я понимаю
C++
1
const char str2[] = "y"
равнозначно
C++
1
const char str2[] = {'y','\0'}
то есть масив с двумя элементами.
На сколько я знаю в c++ array = array2 нельзя делать.(разве что это клас контейнера, где перегружен оператор ==)

правильно (с точки зрения синтаксиса, а не логики) было бы наверное вот так

C++
1
const char str3[] = {str2[0], str2[1]}
0
 Аватар для SergioO
261 / 209 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
16.05.2016, 18:44
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
такая инициализация есть темное наследие чистого Си
только светлое настоящее С++ близко не подпускают к написанию ядра Linux, например, и много еще чего ответственного
Торвальдс о С++
еще в догонку
если почитать что говорили о С++ Столман, Кен Томпсон, Ритчи, то уверен сильно удивитесь.
лично мне С++ не нравится, я изучаю Java, а где Java "очевидно проседает" или нужны системные функции типа, то встраиваю Си код в Java.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
16.05.2016, 18:54
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Renji, а что вобще есть строковый литерал по своей сути?
Явно прописанная в коде константа. А str2 это уже область памяти в которую мы ее помещаем.

Добавлено через 10 минут
Цитата Сообщение от SergioO Посмотреть сообщение
только светлое настоящее С++ близко не подпускают к написанию ядра Linux, например, и много еще чего ответственного Торвальдс о С++
Спросите Торвальдса почему его любимый Си до сих пор не позволяет безымянные аргументы функций и требует struct перед именем структуры даже вне декларации этой самой структуры. Спросите его какими веществами надо было упороться, чтобы void func() не было синонимом void func(void) (первое можно вызвать как func(1,2,3,4)).

Он просто новый язык учить не хочет. Все остальное - рационализация позыва "нафиг это новое, посижу на старом с рудиментами пятидесятилетней давности".
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
16.05.2016, 18:58  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
А str2 это уже область памяти
но ведь в данном случае литерал тоже находится в области памяти, в которую этот литерал был помещен
C
1
2
3
4
5
6
7
#include <stdio.h>
 
int main()
{
    printf("%p", "x");
    return 0;
}
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
16.05.2016, 19:03
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
но ведь в данном случае литерал тоже находится в области памяти, в которую этот литерал был помещен
Де-факто да, но синтаксически "x" и str2 отличаются. Я так полагаю, очередной привет из Си или его предшественников, оставшийся в целях обратной совместимости.
0
 Аватар для SergioO
261 / 209 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
16.05.2016, 19:16
Ferrari F1, если считаете Си темным наследием и склоняетесь к С++, то правильнее использовать string и string.c_str(), когда нужно преобразовать строку к char* с завершающим '\0'.

C
1
2
char* str1 = "x";
const char str2[] = "y";
это Си чистой воды
в С++
C++
1
2
3
4
5
6
7
8
const std::string str = "Constant";
std::string s; //объявили строку
std::getline(cin, s); //считали строку из потока
int N = s.length(); //длина строки
//"пробежались" по всем символам 
for (auto c: s){
}
// поиск подстроки, замена и тд
это светлое наследие С++
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
16.05.2016, 19:21  [ТС]
Цитата Сообщение от SergioO Посмотреть сообщение
считаете Си темным наследием
темным наследием чего?

Написав
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
такая инициализация есть темное наследие чистого Си
имелось в виду инициализация с игнорированием квалификатора типа, что не является правильным, язык целиком я не затрагивал
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
16.05.2016, 19:26
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
темным наследием чего?
Темным наследием C++. C++ сделан на основе C и некоторые странности получил по наследству. В частности, невозможность копирования массивов через str3=str2 (при том что если запихать массив в структуру, он прекрасно копируется).
0
16.05.2016, 19:31  [ТС]

Не по теме:

Цитата Сообщение от Renji Посмотреть сообщение
Темным наследием C++
Си не может быть наследием С++, т.к. первый появился раньше

0
 Аватар для SergioO
261 / 209 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
16.05.2016, 19:41
Цитата Сообщение от Renji Посмотреть сообщение
массивов через str3=str2
например в java тоже с копированием массивов "батва" ))
надо циклом for () для копирования проходить, например, поэтому С++ не одинок.
зато в С++ можно
C++
1
array<Elem,N> arr = arr2
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
16.05.2016, 19:49  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
при том что если запихать массив в структуру, он прекрасно копируется
скорее всего, копируются байты одной структурной переменной в другую, безразлично от внутреннего содержания. Механическое копирование байтов, короче говоря.
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
16.05.2016, 19:50
какие предшественники, какое наследие... вы о чем?
строковый литерал - это термин, которым обзывают последовательность символов, заключенных в двойные кавычки. все. в выражении
C++
1
char* str1 = "x";
str1 - это переменная
"x" - строковый литерал
эти понятия нужно различать
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
16.05.2016, 19:55  [ТС]
Цитата Сообщение от retmas Посмотреть сообщение
последовательность символов
эта последовательность символов представляет из себя символьный массив с нулем терминатором. таким образом, тип указатель на char инициализируется типом константный массив типа char.

Следовательно, всякий константый массив типа char по идее должен являться инициализатором
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
16.05.2016, 20:00
исчо раз читаем выше, что такое строковой литерал

Добавлено через 1 минуту
подумайте, что есть литерал:
C
1
#define STR "str"
Добавлено через 2 минуты
исчо более доходчиво:
строковой литерал - набор буковок в тексте, заключенных в двойные кавычки
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
16.05.2016, 20:01
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
скорее всего, копируются байты одной структурной переменной в другую, безразлично от внутреннего содержания. Механическое копирование байтов, короче говоря.
Копируется то, что указано в конструкторе копирования. Хотя да, при программировании в стиле Си, конструктор копирования в большинстве случаев сводится к побайтовому копированию.
Цитата Сообщение от retmas Посмотреть сообщение
str1 - это переменная
"x" - строковый литерал
эти понятия нужно различать
const int N=10 - константа.
10 - числовой литерал.
Эти понятия надо различать - int array[10] внутри структуры разрешим, а int array [N] нельзя. А если нельзя, но очень хочется, то впилим #define N 10. Он, правда, нагадит во все неймспейсы, но это мелочи. Здравствуй простой и элегантный Си, давно не виделись.

Нет, не нужно их различать. По возможности литерал, константа и переменная должны быть взаимозаменяемы.
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
16.05.2016, 20:02  [ТС]
Цитата Сообщение от retmas Посмотреть сообщение
последовательность символов, заключенных в двойные кавычки
это для человека очевидно, что строковый литерал - это тупо закавыченный текст, т.е. мы определяем лишь визуально.
А с колокольни компилятора этот заковыченный текст - символьный массив.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.05.2016, 20:02
Помогаю со студенческими работами здесь

Инициализация массива. Длина строки
Ребят, добрый день. Ломаю голову и не могу сообразить, как в массив занести не констант. строчку? Ну т.е не константой, например: mas...

Инициализация поля класса (строки в стиле Си): найти причину возникновения ошибки и исправить эту ошибку
Начинаю учить C++ и хочу сделать что-то типо &quot;игры&quot; в текстовом варианте. Вот столкнулся с проблемой - хранение бонусов при ответе,...

Инициализация строки
При создании массива строк в объектном стиле, например, string str = new string Изначально каждая строка имеет значение...

Инициализация строки
Всем привет! Не могу понять, где ошибка( Если я ввожу два символа, например XX, то он выводит значение только первого.. т.е. только 10.....

Безопасная инициализация строки
Здравствуйте. Я разработчик игры на С. В данный момент пишу античит для неё. При обнаружении чита клиента выбрасывает в главное меню с...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru