【问题标题】:Output ASCII value of character输出字符的ASCII值
【发布时间】:2018-03-26 15:01:08
【问题描述】:
#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 ;
  • x 不是const char*char* 那么为什么std::string(x) 可以工作?
  • std::string 的构造函数没有带字符。
  • 请为您的问题添加更多描述,例如您要做什么、预期的输出以及您得到的输出。

标签: c++ ascii


【解决方案1】:
std::cout << "ASCII Value of " << x << "is" << (int)x;

是一种方式(强制转换规避了 I/O 流库对 char 类型的特殊处理),但这将输出您平台的字符编码值,这不是必需 ASCII。

便携式解决方案要复杂得多:您需要将 ASCII 集编码为 128 个元素的数组,该数组能够存储 7 位无符号值,并将 x 映射到其中的合适元素。

【讨论】:

  • C++ 核心指南 ES。 49 说,如果您必须使用演员表,请使用命名演员表。在这种情况下应该是static_cast&lt;int&gt;(x)。请推广良好做法。
  • @RobertAndrzejuk:不,这是教条,在这种情况下是不必要的混淆。在 C++ 中管理 C 风格强制转换行为的规则非常明确。你不能做的是试图在编辑另一个答案时传播教条,除非它正在修复明显错误的东西。在这种情况下,正确的做法是回答自己,以便向社区提供替代方案。在撰写本文时,另一个答案是 int(x),它有其优点。
  • 根据您的建议,我创建了自己的答案。您是一位资深的程序员,确切地了解使用这种语法的含义。初学者不会。我相信正确的答案应该促进最佳实践。我对您帖子的建议编辑是根据本网站的指南创建的。
【解决方案2】:

有 3 种方法可以解决这个问题:

  • 使用to_string
  • 将正确的值传递给cout
  • 正确使用std::string

解决方案已标记(注释中的数字)。


使用std::to_string

从C++11开始,就有了数字转字符串的功能(to_string):

/*(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) Implicit - “只要在不接受该类型但接受其他类型 T2 的上下文中使用某种类型 T1 的表达式时,就会执行隐式转换;”

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

2) Explicit - “使用显式和隐式转换的组合在类型之间进行转换。”

/*(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};

T{e} 构造语法明确表明需要构造。 T{e} 构造语法不允许缩小。 T{e} 是从表达式 e 构造 T 类型值的唯一安全且通用的表达式。转换符号 T(e)(T)e 既不安全也不通用。

关于转换,C++ 核心指南指定了以下内容(以及其他内容)

在这种情况下,我会建议 (3) 或 (4)。


正确使用std::string

stringbasic_string 的特化

using string = basic_string<char>;

basic_string 有很多constructors

只有 2 个构造函数,可以采用预定义数量的字符;

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

用字符 ch 的 count 个副本构造字符串。如果 count >= npos,则行为未定义。

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

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

用s指向的字符串的前count个字符构造字符串。 s 可以包含空字符。字符串的长度是计数。如果 s 不指向 CharT 的至少 count 个元素的数组,则行为未定义,包括 s 为空指针的情况。

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

【讨论】:

  • 我不明白这里的反对意见。虽然我觉得这并没有直接回答这个问题,但它是间接的、全面的。
  • @Bathsheba 虽然反对票不需要附有理由,但这些令人困惑的情况将持续存在。
  • 我今天早上把它调高了。通过说出 OP 应该写的内容,甚至可能包括一个关于可移植性的部分来将答案联系起来可能是一个想法?
  • @Bathsheba 有 8 个建议的正确语法。
  • 没错,但他们有点被埋没了。
【解决方案3】:
#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 ;
} 

你的意思是返回试试这个代码

【讨论】:

    【解决方案4】:
    #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 ;
    }
    

    试试这个叫做return

    【讨论】:

    • 你试过了吗? char(x)x 的值副本,类型相同。
    猜你喜欢
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 2017-02-09
    • 2016-04-06
    相关资源
    最近更新 更多