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

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

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

Author24 — интернет-сервис помощи студентам
Добрый день, такое дело: имеется инициализация
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.05.2016, 10:47
Ответы с готовыми решениями:

Инициализация строки - задачка
Сама задачка от Kastaneda: #include <string> #include <iostream> using namespace std; ...

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

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

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

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

Под это определение вполне может подпадать str3. И как вобще компилятор различает, производится ли инициализация "строковым литералом", ведь по сути просто сопоставляются типы (и там, и там - const char[]) и происходит инициализация. Ведь строковый литерал имеет тип const char[]
0
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
16.05.2016, 18:33 4
Цитата Сообщение от 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 5
На сколько я понимаю
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
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
16.05.2016, 18:44 6
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
такая инициализация есть темное наследие чистого Си
только светлое настоящее С++ близко не подпускают к написанию ядра Linux, например, и много еще чего ответственного
Торвальдс о С++
еще в догонку
если почитать что говорили о С++ Столман, Кен Томпсон, Ритчи, то уверен сильно удивитесь.
лично мне С++ не нравится, я изучаю Java, а где Java "очевидно проседает" или нужны системные функции типа, то встраиваю Си код в Java.
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
16.05.2016, 18:54 7
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Renji, а что вобще есть строковый литерал по своей сути?
Явно прописанная в коде константа. А str2 это уже область памяти в которую мы ее помещаем.

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

Он просто новый язык учить не хочет. Все остальное - рационализация позыва "нафиг это новое, посижу на старом с рудиментами пятидесятилетней давности".
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
16.05.2016, 18:58  [ТС] 8
Цитата Сообщение от Renji Посмотреть сообщение
А str2 это уже область памяти
но ведь в данном случае литерал тоже находится в области памяти, в которую этот литерал был помещен
C
1
2
3
4
5
6
7
#include <stdio.h>
 
int main()
{
    printf("%p", "x");
    return 0;
}
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
16.05.2016, 19:03 9
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
но ведь в данном случае литерал тоже находится в области памяти, в которую этот литерал был помещен
Де-факто да, но синтаксически "x" и str2 отличаются. Я так полагаю, очередной привет из Си или его предшественников, оставшийся в целях обратной совместимости.
0
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
16.05.2016, 19:16 10
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
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
16.05.2016, 19:21  [ТС] 11
Цитата Сообщение от SergioO Посмотреть сообщение
считаете Си темным наследием
темным наследием чего?

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

Не по теме:

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

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

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

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

Нет, не нужно их различать. По возможности литерал, константа и переменная должны быть взаимозаменяемы.
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
16.05.2016, 20:02  [ТС] 20
Цитата Сообщение от retmas Посмотреть сообщение
последовательность символов, заключенных в двойные кавычки
это для человека очевидно, что строковый литерал - это тупо закавыченный текст, т.е. мы определяем лишь визуально.
А с колокольни компилятора этот заковыченный текст - символьный массив.
0
16.05.2016, 20:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.05.2016, 20:02
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru