"to_string" 如何在字符串数组中工作?
How does "to_string" work in array of string?
我想将txt文件中每一行的前4个字符组合起来,与我的关键字进行比较,但是
当我组合这些字符时,我得到了这 4 个字符的 ascii 数字(无论如何)的总和。
我怎么解决这个问题。我的代码在这里:
当我调试时,我看到字符串 search(variable) 是 321.
int main() {
ifstream file("sentence.txt");
if (file.is_open()) {
string line;
while (getline(file, line)) {
string search = to_string(line[0] + line[1] + line[2]); // you see what I mean
if ("dog" == search) {
cout << "there is dog";
}
else {
cout << "there is no dog"<<endl;
}
}
}
}
line[0]
、line[1]
和 line[2]
是 char
,而不是 std::string
。 char
是整数类型,因此将两个 char
加在一起会得到一个整数,它是两个操作数的总和。它不会产生一个 std::string
,它是两个 char
的串联。
要获取 std::string
的子字符串,请使用 substr
成员函数:
std::string search = line.substr(0, 3);
或者,如果您确实需要从单个 char
构造一个 std::string
,请使用接受 std::initializer_list<char>
的构造函数:
std::string search{line[0], line[1], line[2]};
此代码的问题在于,当您访问字符串的一个元素时,您会得到一个字符,它是一个 ASCII 数字,当您尝试对两个字符求和时,您将添加它们的 ASCII 代码。
在您的特定情况下,因为您需要连续字符,所以最好的解决方案可能是对字符串使用 substr
函数 (documentation)。否则,您可能需要将其中一个字符转换为字符串,然后向其中“添加”其他字符。
line
的第一个字符组成的字符串可以通过std::substr
得到。在这种情况下,我实际上更喜欢采用两个迭代器的构造函数:
std::string first3chars{line.begin(),line.begin()+3};
处理少于 3 个字符的 line
。
您的代码添加了三个 char
的值。通过 +
添加 char
不会连接它们,如果可以,为什么要在结果上调用 std::to_string
? char
是整数类型,你看到的 321 是 line
.
中前 3 个字符的数字表示相加的结果
有没有办法将这些字符(由于某种原因看起来是整数类型)再次转换为字符类型。也许这应该可以解决问题,以防“to_string”将这 3 个输入连接成一个;另外 intelli-sense 应该做解释参数用法和返回值的技巧。
函数std::to_string()
旨在将数字转换为字符串表示形式。这不是你需要的。
无需创建新字符串search
来检查字符串line
是否以字符串"dog"
.
开头
创建新字符串 search
效率低下。
相反,您可以这样写
if ( line.compare( 0, 3, "dog" ) == 0 ) {
cout << "there is dog";
}
else {
cout << "there is no dog" << endl;
}
或者,如果你的编译器支持C++20,你也可以这样写:
if ( line.starts_with( "dog" ) ) {
cout << "there is dog";
}
else {
cout << "there is no dog" << endl;
}
我想将txt文件中每一行的前4个字符组合起来,与我的关键字进行比较,但是 当我组合这些字符时,我得到了这 4 个字符的 ascii 数字(无论如何)的总和。 我怎么解决这个问题。我的代码在这里: 当我调试时,我看到字符串 search(variable) 是 321.
int main() {
ifstream file("sentence.txt");
if (file.is_open()) {
string line;
while (getline(file, line)) {
string search = to_string(line[0] + line[1] + line[2]); // you see what I mean
if ("dog" == search) {
cout << "there is dog";
}
else {
cout << "there is no dog"<<endl;
}
}
}
}
line[0]
、line[1]
和 line[2]
是 char
,而不是 std::string
。 char
是整数类型,因此将两个 char
加在一起会得到一个整数,它是两个操作数的总和。它不会产生一个 std::string
,它是两个 char
的串联。
要获取 std::string
的子字符串,请使用 substr
成员函数:
std::string search = line.substr(0, 3);
或者,如果您确实需要从单个 char
构造一个 std::string
,请使用接受 std::initializer_list<char>
的构造函数:
std::string search{line[0], line[1], line[2]};
此代码的问题在于,当您访问字符串的一个元素时,您会得到一个字符,它是一个 ASCII 数字,当您尝试对两个字符求和时,您将添加它们的 ASCII 代码。
在您的特定情况下,因为您需要连续字符,所以最好的解决方案可能是对字符串使用 substr
函数 (documentation)。否则,您可能需要将其中一个字符转换为字符串,然后向其中“添加”其他字符。
line
的第一个字符组成的字符串可以通过std::substr
得到。在这种情况下,我实际上更喜欢采用两个迭代器的构造函数:
std::string first3chars{line.begin(),line.begin()+3};
处理少于 3 个字符的 line
。
您的代码添加了三个 char
的值。通过 +
添加 char
不会连接它们,如果可以,为什么要在结果上调用 std::to_string
? char
是整数类型,你看到的 321 是 line
.
有没有办法将这些字符(由于某种原因看起来是整数类型)再次转换为字符类型。也许这应该可以解决问题,以防“to_string”将这 3 个输入连接成一个;另外 intelli-sense 应该做解释参数用法和返回值的技巧。
函数std::to_string()
旨在将数字转换为字符串表示形式。这不是你需要的。
无需创建新字符串search
来检查字符串line
是否以字符串"dog"
.
创建新字符串 search
效率低下。
相反,您可以这样写
if ( line.compare( 0, 3, "dog" ) == 0 ) {
cout << "there is dog";
}
else {
cout << "there is no dog" << endl;
}
或者,如果你的编译器支持C++20,你也可以这样写:
if ( line.starts_with( "dog" ) ) {
cout << "there is dog";
}
else {
cout << "there is no dog" << endl;
}