#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 ===|
x не является const char* или char*, так почему же std::string(x) должен работать?
похоже, вы хотите создать std::string из одного char.
Для std::string не существует конструктора, использующего символ.
Пожалуйста, добавьте более подробное описание к вашему вопросу, например, что вы пытаетесь сделать, каков предполагаемый результат и какой результат вы получили.





std::cout << "ASCII Value of " << x << "is" << (int)x;
является односторонним (преобразование позволяет обойти специальную обработку типа char библиотекой потоков ввода-вывода), но при этом будет выведено закодированное для вашей платформы значение символа, которое не является обязательно ASCII.
Переносимое решение намного сложнее: вам нужно будет закодировать набор ASCII в массиве из 128 элементов, способных хранить 7-битное беззнаковое значение, и сопоставить x с подходящим его элементом.
Основные принципы C++ ES. 49 говорит, что если вам нужно использовать приведение, используйте именованное приведение. В этом случае должен быть static_cast<int>(x). Пожалуйста, продвигайте передовой опыт.
@RobertAndrzejuk: Нет, это догма, и в данном случае она излишне сбивает с толку. Правила, управляющие поведением приведения в стиле C в C++, очень хорошо определены. Чего вы не должны делать, так это пытаться распространять догму при редактировании другого ответа, если только он не исправляет что-то явно неправильное. Правильное действие в этом случае - ответить самому себе, представляя альтернативу сообществу. На момент написания другого ответа был int(x), который имеет свои достоинства.
По Вашему предложению я создал свой ответ. Вы были опытным программистом и точно понимаете, каковы последствия использования этого синтаксиса. Новичку не будет. Я считаю, что правильный ответ должен способствовать продвижению передового опыта. Мое изменение предложенный к вашему сообщению было создано в соответствии с руководящими принципами этого сайта.
#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 того же типа.
Есть 3 подхода к решению этой проблемы:
to_stringcoutstd::stringРешения отмечены (цифрами в комментариях).
std::to_stringНачиная с C++ 11, есть функция для преобразования чисел в строку (нанизывать):
/*(1)*/ std::cout << std::to_string( x );
Для параметра char нет специализации. Таким образом, значение неявно преобразуется.
coutcout отобразит значение объекта 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. TheT{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 notationsT(e)and(T)eare neither safe nor general.
Что касается преобразований, Основные принципы C++ указывает следующее (среди прочего)
T{e} для построенияВ этом случае я бы предложил (3) или (4).
std::stringstring - это специализация 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 Хотя отрицательные голоса не обязательно должны сопровождаться объяснением причины, эти запутанные ситуации будут сохраняться.
Однако сегодня утром я повысил его. Возможно, стоит связать ответ, сказав, что OP должен был написать, и, возможно, даже включить раздел о переносимости?
@Bathsheba Есть 8 предложений правильного синтаксиса.
Верно, но они немного похоронены.
returb 0 ;->return 0 ;