Выходное значение ASCII символа

#include <iostream>

using namespace std;

int main()
{
    char x;
    cout << "enter a character:";
    cin >> x;
    cout << "ASCII Value of " << x << "is" << string(x);
    return 0 ;
}

ошибка

main.cpp||In function 'int main()':| 
main.cpp|10|error: invalid conversion from 'char' to 'const char*'| 
main.cpp|10|error:   initializing argument 1 of 'std::basic_string<_CharT, _Traits,_Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]'|
||=== Build finished: 2 errors, 0 warnings ===|
returb 0 ; -> return 0 ;
Smit Ycyken 26.03.2018 17:03

x не является const char* или char*, так почему же std::string(x) должен работать?

UKMonkey 26.03.2018 17:03

похоже, вы хотите создать std::string из одного char.

wally 26.03.2018 17:03

Для std::string не существует конструктора, использующего символ.

YSC 26.03.2018 17:03

Пожалуйста, добавьте более подробное описание к вашему вопросу, например, что вы пытаетесь сделать, каков предполагаемый результат и какой результат вы получили.

SUB0DH 26.03.2018 17:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
5
1 964
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий
std::cout << "ASCII Value of " << x << "is" << (int)x;

является односторонним (преобразование позволяет обойти специальную обработку типа char библиотекой потоков ввода-вывода), но при этом будет выведено закодированное для вашей платформы значение символа, которое не является обязательно ASCII.

Переносимое решение намного сложнее: вам нужно будет закодировать набор ASCII в массиве из 128 элементов, способных хранить 7-битное беззнаковое значение, и сопоставить x с подходящим его элементом.

Основные принципы C++ ES. 49 говорит, что если вам нужно использовать приведение, используйте именованное приведение. В этом случае должен быть static_cast<int>(x). Пожалуйста, продвигайте передовой опыт.

Robert Andrzejuk 26.03.2018 18:45

@RobertAndrzejuk: Нет, это догма, и в данном случае она излишне сбивает с толку. Правила, управляющие поведением приведения в стиле C в C++, очень хорошо определены. Чего вы не должны делать, так это пытаться распространять догму при редактировании другого ответа, если только он не исправляет что-то явно неправильное. Правильное действие в этом случае - ответить самому себе, представляя альтернативу сообществу. На момент написания другого ответа был int(x), который имеет свои достоинства.

Bathsheba 26.03.2018 18:47

По Вашему предложению я создал свой ответ. Вы были опытным программистом и точно понимаете, каковы последствия использования этого синтаксиса. Новичку не будет. Я считаю, что правильный ответ должен способствовать продвижению передового опыта. Мое изменение предложенный к вашему сообщению было создано в соответствии с руководящими принципами этого сайта.

Robert Andrzejuk 27.03.2018 06:57
#include <iostream>

using namespace std;

int main()
{
    char x;
    cout<< "enter a character:";
    cin>>x;
    cout<< "ASCII Value of "<< x<< "is"<< int(x);
    return 0 ;
} 

you mean return try this code

#include <iostream>

using namespace std;

int main()
{
    char x;
    cout<< "enter a character:";
    cin>>x;
    cout<< "ASCII Value of "<< x<< "is"<< char(x);
return 0 ;
}

try this its called return

Вы пробовали это? char(x) - это ценная копия x того же типа.

Bathsheba 26.03.2018 21:15

Есть 3 подхода к решению этой проблемы:

  • Используйте to_string
  • Передача правильного значения в cout
  • Правильное использование класса std::string

Решения отмечены (цифрами в комментариях).


Используйте std::to_string

Начиная с C++ 11, есть функция для преобразования чисел в строку (нанизывать):

/*(1)*/        std::cout << std::to_string( x );

Для параметра char нет специализации. Таким образом, значение неявно преобразуется.


Передача правильного значения в cout

cout отобразит значение объекта char в виде символа. Если мы хотим вывести значение объекта char, нам нужно преобразовать его в тип, который cout выводит как число вместо символа.

Стандарт C++ гарантирует:

1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)

Таким образом, можно использовать любой из этих целочисленных типов. Обычно выбирается int.

Здесь можно использовать 4 преобразования:

1) Скрытый - «Неявные преобразования выполняются всякий раз, когда выражение некоторого типа T1 используется в контексте, который не принимает этот тип, но принимает некоторый другой тип T2»;

/*(2)*/        int i = x;
               std::cout << i;

2) Явный - «Преобразование между типами с использованием комбинации явных и неявных преобразований».

/*(3)*/        std::cout << (int)x;

/*(4)*/        std::cout << int(x); // unsigned int(x) - is invalid, 
                                    // has to be a single-word type name

3) Именованный состав.

/*(5)*/        std::cout << static_cast<int>(x);

4) Используйте обозначение T{e} для построения

/*(6)*/        std::cout << int{x};

The T{e} construction syntax makes it explicit that construction is desired. The T{e} construction syntax doesn’t allow narrowing. T{e} is the only safe and general expression for constructing a value of type T from an expression e. The casts notations T(e) and (T)e are neither safe nor general.

Что касается преобразований, Основные принципы C++ указывает следующее (среди прочего)

В этом случае я бы предложил (3) или (4).


Правильное использование класса std::string

string - это специализация basic_string.

using string = basic_string<char>;

basic_string имеет много конструкторы.

Есть только 2 конструктора, которые могут принимать заранее определенное количество символов;

basic_string( size_type count, CharT ch, const Allocator& alloc = Allocator() );

Constructs the string with count copies of character ch. The behavior is undefined if count >= npos.

/*(7)*/        std::string s = std::string( 1, x );

basic_string( const CharT* s, size_type count, const Allocator& alloc = Allocator() );

Constructs the string with the first count characters of character string pointed to by s. s can contain null characters. The length of the string is count. The behavior is undefined if s does not point at an array of at least count elements of CharT, including the case when s is a null pointer.

/*(8)*/        std::string s = std::string( &x, 1 );

Я не понимаю, что здесь голос "против". Хотя мне кажется, что напрямую не отвечает на вопрос, он делает это косвенно и исчерпывающе.

Bathsheba 27.03.2018 11:28

@Bathsheba Хотя отрицательные голоса не обязательно должны сопровождаться объяснением причины, эти запутанные ситуации будут сохраняться.

Robert Andrzejuk 27.03.2018 11:35

Однако сегодня утром я повысил его. Возможно, стоит связать ответ, сказав, что OP должен был написать, и, возможно, даже включить раздел о переносимости?

Bathsheba 27.03.2018 11:40

@Bathsheba Есть 8 предложений правильного синтаксиса.

Robert Andrzejuk 27.03.2018 11:41

Верно, но они немного похоронены.

Bathsheba 27.03.2018 11:42

Другие вопросы по теме