我最近尝试将字符串的元素(仅使用数字构建)转换为int,以避免出现结果(如49而不是1)我必须使用&#39; stringstream&#39; (甚至不知道它是什么以及它是如何工作的)而不是int variable = static_cast<int>(my_string_name[digit_position]);
。
根据我所读到的关于这些&#39;溪流&#39;当你使用它们时类型是无关紧要的,所以我猜是这样的。问题是:我实际上想要转换哪种类型以及为什么它不起作用?我认为字符串元素是一个字符串但显然不是转换没有工作
答案 0 :(得分:2)
我认为字符串元素是char,但如果转换不起作用,则显然不是。
是的,它是一个字母。但是,此char的值不是它在屏幕上的呈现方式。这实际上取决于字符串的编码。例如,如果您的字符串是用ASCII编码的,您可以看到您获得的“奇异”值49必须表示为'1'
个字符。在此基础上,您可以减去字符'0'
的ASCII代码以获取这些字符的数值。但是,要非常小心:这在很大程度上取决于您的编码。当你甚至无法对它们进行天真的索引时,你的字符串可能会使用多字节字符。
答案 1 :(得分:2)
char
值已经是数字,因此static_cast
在这里不会对您有所帮助。你真正需要的是:
int variable = my_string_name[digit_position] - '0';
对于ASCII值,数字'0' - '9'
被编码为49 - 59
的十进制数。因此,要获得由数字表示的数值,我们需要减去49的第1位数值。
为了使代码可以移植到其他字符编码表(例如EBCDIC),'0'
被减去。
答案 2 :(得分:2)
我相信你所寻找的不是演员,而是std::stoi
(http://en.cppreference.com/w/cpp/string/basic_string/stol)函数,它将整数的字符串表示转换为int
。
答案 3 :(得分:1)
假设您有一个字符串:std::string myString("1");
。您可以访问类型为char
的第一个元素,然后通过int
将其转换为static_cast
类型。但是,您对将要发生的事情的预期是不正确的。
在查看ASCII table for number 1
后,您会看到它的基数为10的整数值为49
,这就是为什么演员会给出您看到的输出。相反,您可以使用转化功能,例如atoi
(例如atoi(&myString[0]);
)。
答案 4 :(得分: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';
答案 5 :(得分:0)
您正在使用ASCII字符代码表示数字,而不是实际数字。但是因为ASCII字符代码是laid out in order:
'0'
'1'
'2'
'3'
'4'
'5'
'6'
'7'
'8'
'9'
因此,如果您要转换单个字符并且您的角色位于基数10,那么您可以使用:
int variable = my_string_name[digit_position] - '0'
但这取决于使用按顺序排列的字符代码。具体来说,如果这里散布着任何其他角色,这根本不起作用(我不知道任何字符代码映射没有按顺序列出这些。)
但为了保证转换,您应该使用stoi
:
int variable = stoi(my_string_name.substr(digit_position, 1))
答案 6 :(得分:-1)
这里显示了如何执行此类操作。
#include <iostream>
#include <string>
int main()
{
std::string s( "12345" );
for ( std::string::size_type i = 0; i < s.size(); i++ )
{
int x = s[i] - '0';
std::cout << x;
}
std::cout << std::endl;
int x = std::stoi( s );
std::cout << x << std::endl;
return 0;
}
程序输出
12345
12345