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

时间:2020-10-02 21:12:24

标签: c++

#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

1 个答案:

答案 0 :(得分:1)

(将我的评论作为答案并进行扩展)

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

该语句是没有意义的:getline(istream&,string&)函数将输出 characters ,而不是将字节输出到string实例中(如果默认情况下使用宽字符,则会得到相同的代码会产生不同的结果),因此在评论中说“正在将指针存储在前三个字节而不是字符值中”,就像在存储一个水果篮 橙色。

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

无论如何,最大的提示是您实际上对指针没有任何问题是在任何现代平台上指针的长度都不是3字节(24位)(因为24位指针只会给您16MiB的地址)空格)...所以我心想,既然您的程序正在读取文本文件(foo.txt),并且您注意到文本出现在文件means there's 3 "invisible" characters at the start of the file的第3个字符位置-如果不是不是Microsoft决定在UTF-8中保存的所有文本文件加一个字节顺序标记的前缀,那么程序就可以检测到UTF-8文本文件,从而正确地将它们解释为UTF-8而不是ASCII或其他OEM,这是不寻常的编码-因为与将ASCII与UTF-16(每个其他字节均为90%的时间为零)进行比较不同,几乎不可能轻松地比较ASCII文件和UTF-8文件(尤其是仅使用{{1}以下字符的UTF-8文件) }),因为编码不明确。问题在于使用UTF-8的文件实际上不应具有BOM前缀,因为BOM仅与UTF-16和UTF-32相关(因为UTF-8起作用,而与字节序和字节顺序无关)。

UTF-8 BOM字节为0x7F-其确切值的原因很复杂-但我敢打赌,您的0xEF, 0xBB, 0xBF在计算机上显示的前3个字符是不可见的或rendered using Mojibake characters,因为计算机将string val解释为可见的正常人字符,但不是-或它向您显示了原始值,也许调试器具有将这些字节解释为指针地址的选项-但这只是您的调试器执行的操作。