std::string
是否应该在所有平台和标准编译器上以Ascii编码保存一组字符?
换句话说,如果我这样做,我可以确定我的C ++程序将获得一组Ascii字符:
std::string input;
std::getline(std::cin, input);
修改
更确切地说,我想确保如果用户输入"a0"
,我会得到一个包含两个元素的std::string
。第一个是97
,第二个是48
答案 0 :(得分:6)
否。 std::string
没有"字符&#34 ;;它包含 bytes 。
这些字节可以通过ASCII或EDBCIC或Unicode编码形成一些人类可读的字符串。它们可以是存储计算机可读信息(例如JPEG图像)的二进制编码。它们可能是外星人关于如何连续三周使用Stack Overflow而不被贬低甚至一次的指导。它们可能是完全随机的白噪声。
您的程序需要了解它所读取的数据实际意味着什么,以及它是如何编码的。这应该是程序员的任务的一部分。
(很不幸,现在误导,char
被命名为char
。)
答案 1 :(得分:3)
不,不能保证
std::string input;
std::getline(std::cin, input);
将仅返回ASCII字符。 char
保留的值范围不限于ASCII字符。
如果您的平台使用的编码与ASCII不同,那么您显然会得到一组不同的字符。
即使您的平台使用ASCII编码,如果平台上的char
是无符号类型,也可以非常轻松地保留extended ASCII characters。
答案 2 :(得分:3)
换句话说,如果我这样做,我可以确定我的C ++程序会得到一组Ascii字符......
没有。 std::string
实际上是std::basic_string<>
的专业化,就像是
using std::string std::basic_string<char>;
:
template<
class CharT,
class Traits = std::char_traits<CharT>,
class Allocator = std::allocator<CharT>
> class basic_string;
并且可以保存使用Traits
定义的任何类型的字符。
简而言之std::string
可以包含ASCII字符编码,以及EBCDIC或任何其他编码。但它应该是透明的,就像你如何使用它一样。