这是我编写的将整数转换为字符串的代码。
#include <iostream>
using namespace std;
int main()
{
string s;
int b=5;
s.push_back((char)b);
cout<<s<<endl;
}
我预计输出为5,但它给了我空白。
我知道还有另一种方法可以使用stringstream,但我想知道这个方法有什么问题?
答案 0 :(得分:6)
数字的字符代码不等于字符在典型系统中表示的整数。
小数字的字符代码是连续的(N3337 2.3字符集,第3段),因此您可以添加'0'
将一位数字转换为字符。
#include <iostream>
using namespace std;
int main()
{
string s;
int b=5;
s.push_back((char)(b + '0'));
cout<<s<<endl;
}
答案 1 :(得分:4)
您将整数 5 解释为字符。在ASCII编码中,当您查找here时, 5 是查询 控制字符。
另一方面,字符 5 由十进制数53表示。
答案 2 :(得分:2)
您的代码中的问题是您将整数5转换为ASCII(=&gt; ENQ ASCII代码,这不是“可打印”)。 要正确地将其转换为ASCII,您必须添加ASCII代码'0'(48),所以:
std::stringstream ss; //from <sstream>
ss << 5;
std::string s = ss.str ();
但是,要将整数转换为std :: string,请使用:
template <typename T>
std::string toString (T arg)
{
std::stringstream ss;
ss << arg;
return ss.str ();
}
我总是在我的项目中使用这个辅助函数:
{{1}}
答案 3 :(得分:1)
正如其他人所说,你不能像你一样将整数转换为字符串。
恕我直言,最好的方法是使用C ++ 11方法std::to_string。
您的示例将转换为:
using namespace std;
int main()
{
string s;
int b=5;
s = to_string(b);
cout<<s<<endl;
}
答案 4 :(得分:0)
此外,您可以使用stringstream, std :: to_string在GCC上对我不起作用
答案 5 :(得分:0)
如果我们在2016年从零开始编写C ++,也许我们可以做到这一点。然而,因为它选择(大部分)向后兼容C等相当低级别的语言,'char'
实际上只是一个数字,字符串/打印算法解释为一个字符 - 但大多数语言不是&#39对待特殊。包括演员。因此,通过执行(char)
,您只需将32位有符号数(int
)转换为8位有符号数(char
)。
然后在打印时将其解释为字符,因为打印功能会对其进行特殊处理。但它打印的值不是'5'
。通信是常规的,完全是随意的;第一个数字保留给特殊代码,这些代码现在可能已经过时了。正如Hoffman所指出的,位值5
是Enquiry
的代码(无论它意味着什么),而要打印'5'
,字符必须包含值53
。要打印适当的空间,您需要输入32
。除了有人认为这与几十年前的任何事情一样好以外,没有任何意义,而且会议陷入困境。
如果您需要了解其他字符和值,您需要的是一个&#34; ASCII表&#34;。只是google它,你会发现很多。
你会注意到同一案件的数字和字母按照你期望的顺序彼此相邻,所以至少有一些逻辑。但要注意,它通常不直观:例如,大写字母在小写字母之前,所以'A' < 'a'
。
我想你已经开始明白为什么依靠专用的系统函数为字符串更好了!