"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::stringchar 是整数类型,因此将两个 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_stringchar 是整数类型,你看到的 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;
}