Вопрос для программистов. Не понимаю некоторые мелочи в string и char.

Компьютеры программирование программы C++

Например, возьмем простой код:

char s[]={0};
scanf("%s",s);
if (s=="hello") printf("ok");
else printf("fail");
getch();
return 0;

Вроде должен работать, но нет. Все время выдает fail. Вроде какая-то мелочь, но не понимаю.

Теперь, например, я хочу заменить char s[] на char* s. Заменяю, но программа выдает ошибку: "Необработанное исключение по адресу 0x6E63ADD5 (msvcr110d.dll) в ConsoleApplication1.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x00000000." Тоже не понимаю, почему?

Теперь заменяю char* s на string s. Ошибка в строке: if (s=="hello") printf("ok"). Что-то вроде того, что нельзя сравнивать string и const char[6]. Опять же, почему? И если нельзя так, то как можно? Объясните, пожалуйста.
Ответы:
1. scanf("%s", s); - здесь запись происходит по адресу переменной, следовательно должно быть так: scanf("%s", &s); более того, для хранения строки нужно определить ее длину не меньшую чем длина предполагаемой строки.
2. Если создается указатель char* s, то про заполнении памяти по этому указателю память нужно сначала выделить. А потом освободить.
3. string и const char - несовместимые типы. String это класс, содержащий в себе строку и кучу другого полезного и не очень мусора, char же просто массив символов. Чтобы сравнение было верным нужно использовать string.c_str() - эта функция вернет, по сути, массив символов, т.е. char.
4. Оператор == не подходит для сравнения строк. Для сравнения char-ов нужно использовать сишные функции для строк - strcmp и т.д., для ставнения string-ов нужно использовать встроенные методы сравнения класса string - string::compare.
Хорошо описанный пример работы строк, там же с массивами символов.
char s[]={0};
---
Ты создал массив типа char, размером в 1(один) элемент. Ничего удивительного, что оно при попытке записи туда чего-то большего падает с сегфолтом. А s не может быть "hello" даже теоретически, потому что s - это указатель.


11 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.