C++强制转换字符串的单个元素

C++ casting a single element of a string

本文关键字:单个 元素 字符串 转换 C++      更新时间:2023-10-16

我最近尝试将字符串的一个元素(仅由数字构建)转换为 int,为了避免奇怪的结果(如 49 而不是 1),我不得不使用"stringstream"(甚至不知道它是什么以及它是如何工作的)而不是 int variable = static_cast<int>(my_string_name[digit_position]);

根据我读到的有关这些"流"的信息,当您使用它们时,类型无关紧要,所以我想情况就是如此。问题是:我实际上想从什么类型转换,为什么它不起作用?我认为字符串元素是字符,但如果转换不起作用,显然不是。

我认为字符串元素是字符,但如果转换不起作用,显然不是。

是的,这是一个炭。但是,此字符的值不是它在屏幕上的呈现方式。这实际上取决于字符串的编码。例如,如果您的字符串是用 ASCII 编码的,您可以看到您获得的"奇怪"49 值必须表示为'1'字符。在此基础上,您可以减去字符'0'的 ASCII 代码以获取这些字符的数值。但是,要非常小心:这在很大程度上取决于您的编码。当您甚至无法如此天真地索引它们时,您的字符串可能会使用多字节字符。

我相信

您正在寻找的不是强制转换,而是std::stoi(http://en.cppreference.com/w/cpp/string/basic_string/stol)函数,它将整数的字符串表示转换为int

char值已经是数字,这样的static_cast在这里不会有太大帮助。您真正需要的是:

int variable = my_string_name[digit_position] - '0';

对于 ASCII 值,'0' - '9'的数字被编码为来自 49 - 59 的十进制数。因此,要获得由数字表示的数值,我们需要减去第 1 位数字值 49。

为了使代码可移植到其他字符编码表(例如EBCDIC),减去'0'

假设你有一个字符串:std::string myString("1"); .您可以访问第一个元素,即类型 char 并通过 static_cast 将其转换为类型 int。但是,您对将要发生的事情的预期是不正确的。

在查看 ASCII 表中的数字 1 时,您会发现它的基数为 10 的整数值为 49 ,这就是为什么强制转换给出您所看到的输出。相反,您可以使用像atoi这样的转换函数(例如,atoi(&myString[0]); )。

你的"怪异结果"实际上并没有那么奇怪。当访问std::string的单个字符时,如下所示:my_string_name[digit_position]你会得到一个char。将该char放在int中会将"1"转换为int。查看 http://www.asciitable.com/我们可以看到 49 是 '1' 的表示形式。要获得实际数字,您应该int number = my_string_name[digit_position] - '0';

您正在使用数字的 ASCII 字符代码,而不是实际数字。但是,由于 ASCII 字符代码的布局顺序:

  1. '0'
  2. '1'
  3. '2'
  4. '3'
  5. '4'
  6. '5'
  7. '6'
  8. '7'
  9. '8'
  10. '9'

因此,如果您要转换单个字符并且您的字符以 10 为基数,那么您可以使用:

int variable = my_string_name[digit_position] - '0'

但这取决于按顺序排列的字符代码的使用。具体来说,如果这里穿插了任何其他字符,这根本不起作用(我不知道任何字符代码映射没有按顺序列出这些字符。

但是为了保证转换,您应该使用stoi

int variable = stoi(my_string_name.substr(digit_position, 1))