【问题标题】:Part of string conversion into integer - C++部分字符串转换为整数 - C++
【发布时间】:2016-01-09 10:16:16
【问题描述】:

我想知道是否可以使用static_cast 将部分字符串转换为整数? 我知道存在类似atoi() 的东西,但我真的应该使用它来仅将字符串的第一个字符转换为整数吗?

int w;
string my_str;
getline(cin, my_str);
w = static_cast<int>(my_str[0]) - 48;

这样的事情正确吗?或者我应该以其他方式做到这一点?

【问题讨论】:

  • @Marvin 编辑了这个问题并且48 与42 如此接近的事实让我很开心:)
  • my_str[0] 将返回 char,因此将其转换为 int 是多余的。

标签: c++ string integer static-cast


【解决方案1】:

只要您确定my_str[0] 包含数字字符,就可以了。

你应该避免像48这样的幻数,最好写w = my_str[0] - '0';

数字48 是'0' 的ASCII 码数字表示。还有其他character code systems(如EBCDIC 代码),c 或c++ 语言没有明确的概念,数字表示可能完全不同。

也就是说,使用 '0' 可以移植到许多字符代码系统,而不仅仅是 ASCII 代码。

【讨论】:

  • 但是为什么 - '0' ?当我使用 char[] 而不是 string 时,我写了 '- 48' 并且它是正确的。
  • @Monika 这是 48 的 ASCII 字符表示。字符本身被处理为数值。你甚至不需要static_cast&lt;int&gt;。
  • 那么如果 -'0' 代表 - 48 ,我不能使用第二个选项吗?
  • @Monika 恕我直言'0' 更清晰,但您当然可以使用48。
  • C++ 标准不保证'0' 为48。所以'0' 不仅更好,也是唯一正确的方法。
【解决方案2】:

没有任何需要使用 static_cast 因为在任何情况下整数提升都应用于char 类型的表达式my_str[0]。所以这两个表达式

static_cast<int>(my_str[0]) - 48; 

和

my_str[0] - 48;

是等价的。

如果您只想转换字符串的一个字符,这是正确的。否则你应该使用标准函数stoi。

此外,使用字符文字 '0' 代替幻数 48 会更好

my_str[0] - '0';

因为它更具可读性和清晰性,并且不依赖于使用的编码系统。例如,在 EBCDIC 中,零代码是 0xF0。

【讨论】:

    【解决方案3】:

    一般来说,您最好使用'0' 而不是48。

    虽然在实践中最常使用 ASCII 表示(或兼容表示),但也有标准化字符集,其中 '0' 在数字上不等于 48。

    还有一个可读性参数。对于普通人来说,使用像48 这样的幻数来理解代码更加困难。这使得更容易理解 x - '0' 在 x - 48 上所做的事情。

    【讨论】:

      【解决方案4】:

      你的演员返回你的第一个字符的 ascii 代码。而且你实际上并不需要演员表。 my_str[0] - '0' 也可以完成这项工作。

      只要它介于 '0' 和 '9' 之间,它就可以按您的意愿工作。但是你必须检查结果。因为如果那个字符超出了边界,你会得到一个负数或超过 9 的数字作为结果

      【讨论】:

      • 我不知道 my_str[0] 包含什么,因为程序的用户可以在那里写任何他们想要的东西。但是在此之后和转换之后,我正在检查它是否是正确的值(我需要介于 '1' 和 '5' 之间的值)int wybor; do{ wybor_opcji.clear(); getline(cin, wybor_opcji); wybor = static_cast&lt;int&gt;(wybor_opcji[0]) - 48; } while((wybor_opcji[0] &lt; '1') || (wybor_opcji[0] &gt; '5') ); 在 while() 内部检查是否正确或者我应该写 '1' 和 '5 '没有''?
      • 那看起来不错。既然您将 char 转换为整数,为什么不在您的 while 条件中使用 wybor 值?像这样:while((wybor &lt; 1) || (wybor &gt; 5) );
      【解决方案5】:

      计算机只能理解数字,这就是为什么键盘上的字符(和其他)使用编码系统1表示,其中每个字符都分配有唯一的数字。

      字符串是字符序列,正如我们所说,每个字符都由一个数字表示。在字符表示(如 ASCII) 涉及从 '0' 开始按顺序排列数字 '0' 到 9 的情况下。

      如果您有一个数字字符,请将 '0' "converts" 减去它的数字值,因为您的情况下的表达式:

      w = static_cast<int>(my_str[0]) - 48;
      

      在代表字符值的数字int之间进行减法运算。其中十进制值:48唯一代表字符'0'2。

      static_cast&lt;int&gt; 是多余的,因为整个右手边都是由整数组成的

      注意:减去'0' 是一个老技巧,用于真正了解计算机的人所使用的转换,不像我们。


      1.编码标准的一个例子是ASCII。

      2。 '0' in ASCII = 48 // 十进制。

      P.S.:如果数字 42 是 '0' 的 ASCII 码数字表示,这个问题会更好,那么每个答案都会非常有趣。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-29
        • 1970-01-01
        • 1970-01-01
        • 2014-03-06
        • 1970-01-01
        • 1970-01-01
        • 2021-02-06
        • 1970-01-01
        相关资源
        最近更新 更多