【问题标题】:Looping through string of integers gives me completely different numbers?遍历整数字符串给我完全不同的数字?
【发布时间】:2020-11-17 02:00:58
【问题描述】:

我是 C++ 的初学者,如果我在这里犯了一个愚蠢的错误,请原谅我。

我想在下面的代码中循环一串整数:

#include <string>

using namespace std;

int main() {
    string str = "12345";
    for (int i : str) {
        cout << i << endl;
    }
    return 0;
}

但我收到了输出:

49
50
51
52
53

我知道如果我使用 char 而不是 int,我会得到正常的输出,但为什么我会收到比应有的多 48 的整数输出?

【问题讨论】:

  • 您会看到字符的 ASCII 值。见asciitable.com
  • 尝试使用 char 而不是 int。
  • 这个经验的一个有用的收获是你可以减去 '0' 的值(在 ASCII 的情况下是 48,但你几乎总是使用 '0' 更好,因为它更容易从数字中读取)字符,您将获得该数字的数值。
  • 您的字符串不包含ints。它拥有chars。

标签: c++ string loops integer


【解决方案1】:

当您循环通过 string 时,您将获得 char 类型的元素。如果您将char 转换为int,您将获得char 的ASCII 值,当您这样做时会发生这种情况:

string str = "12345";
for (int i : str) {   // each char is explicitly converted to int 
  cout << i << endl;  // prints the ascii value
}

'0' 的 ASCII 值是 48'1'49 等等,这就解释了你得到的输出。

【讨论】:

    【解决方案2】:

    正如@cigien 所说,您只需将其从 int 更改为 char 即

    string str = "12345";
    for (char i : str) {
        cout << i << endl;
    }
    

    或所有自动关键字的一种解决方案

    string str = "12345";
    for (auto i : str) {
        cout << i << endl;
    }
    

    【讨论】:

      【解决方案3】:

      您需要知道的第一件事是字符串是字符的数组/序列。 您可以将 char 视为单个字符。 但它的编码方式是一个数字。 例如,字符“a”被编码(在 ASCII 中)为数字 97。

      现在你的 for 循环显示 int i: str。 你告诉它在字符串中寻找 integers 。 但是字符串是字符的数组/序列,而不是整数。 所以循环需要每个字符, 而不是看字符本身是什么, 它为您提供 char 的整数编码值, ASCII 值。

      现在数字使用具有最低编码值的字符“0”进行编码, '1' 具有下一个值, '2',下一个, 以此类推,直到数字“9”。 我永远记不起 '0' 的实际 ASCII 值是什么。 . . . 但是因为数字字符是以这种方式连续编码的, 您可以通过减去 '0' 的底层整数编码值将任何数字 char 转换为其 int 值。

      #include <string>
      
      using namespace std;
      
      int main() {
          string str = "12345";
          for (char c: str) {
              cout << (c - '0') << endl; // gives you the actual int value, but only works if the char is actually a digit
          }
          return 0;
      }
      

      【讨论】:

        【解决方案4】:

        for (int i : str) { 实际上是语法糖

        for (auto iterator = str.begin(); iterator != str.end(); iterator++) {
           int i = (int) *iterator;
        

        但是来自 string::iterator 的 *-operator 实际上是一个重载,它返回当前字符。它将因此被强制转换为 int。然后你看到的是这个数字。它是字节的整数值。不一定是ASCII。也可以是 ANSI。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-06-16
          • 2017-10-16
          • 2023-01-05
          • 2015-09-09
          • 2010-11-17
          • 2016-05-02
          • 1970-01-01
          • 2023-03-23
          相关资源
          最近更新 更多