【问题标题】:C++ Converting/casting String letters to integer values (ASCII)C ++将字符串字母转换/转换为整数值(ASCII)
【发布时间】:2013-02-08 10:17:37
【问题描述】:

我目前正在做一个项目,我需要创建两个用于包含字符串的数据结构。其中一个必须是链表的一种形式,并且我已经建议将单词分成每个字母表中的单独列表。我需要考虑效率,所以我有一个大小为 26 的 Head 指针数组,并且想将给定单词的第一个字符转换为整数,以便将其放入下标,例如:

//a string called s is passed as a parameter to the function
int i = /*some magic happens here*/ s.substr(0, 1);
currentPointer = heads[i]; //then I start iterating through the list

我一直在四处寻找,我似乎发现的只是如何将字符串中的数字字符转换为整数,而不是字母字符,我想知道我到底如何才能在不求助于一大堆丑陋的 if 语句

【问题讨论】:

    标签: c++ string integer ascii letters


    【解决方案1】:

    当您将 i 设置为第一个字符的值时,您将获得 ASCII 值。 所以我超出了你的 0-25 范围:见 man ascii 您可以通过减去第一个 alaphabet ascii 字母来减少它。 (请注意案件)

     std::string   s("zoro");
     int   i = s[0];
    
     std::cout << "Ascii value : " << i << " Reduced : " << i - 'a' << std::endl;
    

    这会产生 ASCII 值 'z' = 112 和 25 作为缩减值,正如预期的那样。

    【讨论】:

    • 另请参阅 std::toupper()std::tolower() 在比较之前进行转换。这将消除检查大小写以及简化数学的需要。
    【解决方案2】:

    我认为您将值与表示混淆了。 “十”“10”和“1 1 1 1 1 1 1 1 1 1”都是同一个值,只是表示方式不同而已。

    我一直在寻找,我似乎发现的只是如何将字符串中的数字字符转换为整数,而不是字母字符

    没有区别。无论如何,字符总是由整数表示。这只是一个代表问题。以您想要的方式呈现价值。

    顺便说一句,这是程序员必须理解的一个关键概念。所以值得花一些时间考虑一下。

    这种误解的一个典型例子是“我有一个变量i,它有一些十进制值。我怎样才能让它以十六进制存储一个值?”当然这没有意义,它存储,而十六进制和十进制是表示。如果您有十辆汽车,那么您有十辆汽车,而不是十进制或十六进制。如果i 的值为十,那么十在i 中,而不是十进制或十六进制的十表示。

    当然,当您显示存储在i中的时,您必须选择如何表示它。您可以将其显示为ten,或10| | | | | | | | | | |,或其他。

    并且您可能有一个字符串,其中 以十六进制表示,您可能需要分配该 到一个变量。这需要将表示转换为它所表示的值。

    有输入和输出函数,可以在各种表示中输入和输出

    【讨论】:

    • +1 用于强调价值和表现之间的差异。
    【解决方案3】:

    我怀疑您想将存储在字符串中的数字作为字符转换为整数,例如字符'9' 到整数9

    为此:

    char c = '9';
    int x = c - '0';
    

    无论您的计算机使用的是 ASCII 还是 EBCDIC...

    【讨论】:

      【解决方案4】:

      在这种情况下,您似乎不需要atoiitoa(例如J 都不会做任何非常有用的事情)。你只想要这样的东西:

      int i = tolower(s[0])-'a';
      

      从理论上讲,这不是可移植的——如果有任何机会在使用 EBCDIC 的机器(即 IBM 或兼容的大型机)上使用代码,你会想要使用类似 'z'-'a' 的东西作为你的大小数组,因为它不会正好是 26(EBCDIC 包括在一些字母之间插入的一些其他字符,所以这些字母是按顺序排列的,但不是连续的)。

      可能更重要的是,如果您想支持英语以外的其他语言,事情会完全改变——您的字母数量可能与 26 个不同,它们可能并不都是连续的,等等。在这种情况下,您的基本设计确实是个问题。您可能需要几乎完全重新设计,而不是修复那一行代码。

      不过,顺便说一句,链表在这里很有可能不是一个很好的选择。

      【讨论】:

      • 我会说,尽管在这种特定情况下不相关(该项目是大学课程,我决定使用这种选择下标的方法,因为我正在接受效率测试,并且我们'需要使用链表来处理其中的一半),我会记下您的其余 cmets,非常感谢您的帮助
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-27
      • 2016-08-01
      • 1970-01-01
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多