@AlexandrT1

Почему указатель на char выводит всю строку, а не первый символ?

Здравствуйте. Подскажите пожалуйста.

Я знаю, что оператор '<<' перегружен для *char, но не до конца понял этого. Почему при выполнении программы выводится "String", а не "S"?

int main() {
    char *s;

    s = "String";
    
    cout << s << '\n';

    return 0;
}
  • Вопрос задан
  • 2163 просмотра
Решения вопроса 3
@ittakir
Потому что вы выводите в cout указатель на char. Если хотите вывести только первый символ, передавайте его по значению:
cout << *s;
//или
cout << s[0];
Ответ написан
Комментировать
mrjbom
@mrjbom
Как это не до конца поняли?
Он перегружен таким образом, что при передаче ему указателя на char, он будет выводить символы до нуль-терминатора.
Ну а как выводятся отдельные символы, показали выше.
Ответ написан
Комментировать
RabraBabr
@RabraBabr
Класс ostream определяет функции операции вставки для следующих типов указателей:
• const signed char *
• const unsigned char *
• const char *
• void *
He забывайте, что C++ представляет строку, используя указатель на ее местоположение. Указатель может иметь форму имени массива элементов типа char, явного указателя на char или же строки в кавычках. Таким образом, все следующие операторы с cout отображают строки:
char name[20] = "Dudly Diddlemore"; char * pn = "Violet D'Amore"; cout « "Hello!";
cout « name;
cout « pn;
Для определения окончания последовательности отрбражаемых символов методы используют завершающий нулевой символ.
C++ интерпретирует указатель любого другого типа как void * и выводит числовое представление адреса. Если требуется получить адрес строки, необходимо выполнить приведение к другому типу, как показано в следующем фрагменте кода:
int eggs = 12;
char * amount = "dozen";
cout << &eggs; // выводит адрес переменной eggs
cout << amount; // выводит строку "dozen"
cout << (void *) amount; // выводит адрес строки "dozen"


Из: Язык программирования C++Лекции и упражнения 6-е издание Stephen Prata
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
myjcom
@myjcom Куратор тега C++
(для простоты опишем так)
Внутри перегруженной версии
operator<<

https://code.woboq.org/gcc/libstdc++-v3/include/st...

template<typename _CharT, typename _Traits>
    inline basic_ostream<_CharT, _Traits>&
    operator<<(basic_ostream<_CharT, _Traits>& __out, const _CharT* __s)
    {
      if (!__s)
        __out.setstate(ios_base::badbit);
      else
        __ostream_insert(__out, __s,
                         static_cast<streamsize>(_Traits::length(__s)));
      return __out;
    }


под капотом используется sputn

Writes count characters to the output sequence from the character array whose first element is pointed to by s. The characters are written as if by repeated calls to sputc(). Writing stops when either count characters are written or a call to sputc() would have returned Traits::eof().

где count это strlen(s);

P.S.
в C++ string literal это все таки const char*
в С++ есть std::string который является предпочтительным в С++
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы