繁体   English   中英

从字符串中获取第一个字符

[英]Getting the first character from a string

#include <string>
using namespace std;

ifstream input = "foo.txt";
string val;
getline(inputFile, val); //using ifstream, no empty string
//val = "hello"

cout << val[0] // \357
cout << val[3] // h

所以我理解它的方式是,我将指针存储在前三个字节而不是字符值中? 有没有办法让我可以访问 [0] 处的字符? 我使用 std::string

(发布我的评论作为答案并对其进行扩展)

我将指针存储在前三个字节而不是字符值中?

此语句毫无意义: getline(istream&,string&)函数将字符而不是字节输出到string实例中(如果您默认使用宽字符,则使用相同的代码会得到非常不同的结果),因此请阅读您的评论你说你“在前三个字节中存储指针而不是字符值”就像说你一个橘子存储了一个水果篮。

其次, getline不会在您传递给它的string val内存储指针 - 并且string本身不会在其内部字符数组的元素内存储分解的指针(有趣的事实: 在 C++11 之前string的字符没有需要存储在连续的内存中!)。

无论如何,最大的提示表明您实际上没有任何指针问题是指针在任何现代平台上都不是 3 个字节(24 位)长(因为 24 位指针只会给您 16MiB 的地址空间)。 ..所以我想,鉴于您的程序正在从文本文件( foo.txt )中读取,并且您注意到文本出现在文件中的第 3 个字符位置意味着文件开头有 3 个“不可见”字符- 如果不是 Microsoft 决定在所有以 UTF-8 保存的文本文件前加上字节顺序标记,这样程序就可以检测 UTF-8 文本文件并正确地将它们解释为 UTF-8 而不是 ASCII 或其他一些 OEM 编码 - 因为与比较 ASCII 和 UTF-16(其中每隔一个字节 90% 的时间)不同,几乎不可能轻松比较 ASCII 文件和 UTF-8 文件(尤其是仅使用0x7F以下字符的 UTF-8 文件) ) 因为编码不明确。 问题是使用 UTF-8 的文件实际上不应该有 BOM 前缀,因为 BOM 只与 UTF-16 和 UTF-32 相关(因为 UTF-8 的工作与字节序和字节顺序无关)。

UTF-8 BOM 字节是0xEF, 0xBB, 0xBF - 它们确切值的原因很复杂 - 但我敢打赌,你的计算机上显示的string val的前 3 个字符是不可见的或使用 Mojibake 字符呈现的,因为计算机将0xEF解释为一个可见的、正常人类的字符,它不是——或者它向你展示了原始值,也许你的调试器可以选择将这些字节解释为指针地址——但这只是你的调试器这样做.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM