为什么执行时会跳过前 2 个字符? C++

why does the first 2 chars get skipped when executing? C++

while(!Info.eof()) {
    std::getline(Info, line,'\r');

    char a[line.length()];
    char things[]= ":.\n[=10=]";

    for(int i=0;i<sizeof(a); i++) {
       a[i]= line[i];
    }


    ptr = strtok(a, things);
    ptr = strtok(nullptr,things);


   while (ptr!= nullptr) {
        ptr = strtok(nullptr,things);
        std::cout << ptr << std::endl;
   }

Info 是 ifstream 输入文件。行是一个字符串。当我 cout << line 它显示一切都没有问题时,问题是我需要带走除了所需的字符串和 int 之外的所有东西,我已经完成了,但前两行没有显示。当我第一次执行它时,它显示了所有内容,昨天它跳过了第一行,今天跳过了前两行。我猜这与记忆或看不见的东西有关,我需要帮助,谢谢。

您遗漏了一件事——C 风格的字符串以零结尾。你没有那样做。

其次,您在 while 循环之前执行了两次 strtoks,这就是您丢失一些东西的原因。

好吧,对于初学者来说,您在第一次 cout 打印之前调用了 strtok() 3 次。所以你跳过了前几个子字符串。

此外,您的代码有错误,即using eof() in a loop, and using non-standard variant-length arrays

尝试更像这样的东西:

while (std::getline(Info, line))
{
    const char *things = ":.";

    ptr = strtok(line.data()/* or: &line[0]*/, things);
    while (ptr)
    {
        std::cout << ptr << std::endl;
        ptr = strtok(nullptr, things);
    }

    ...
}

或者,作为 for 循环:

while (std::getline(Info, line))
{
    const char *things = ":.";

    for(ptr = strtok(line.data()/* or: &line[0]*/, things);
        ptr != nullptr;
        ptr = strtok(nullptr, things))
    {
        std::cout << ptr << std::endl;
    }

    ...
}

尽管如此,您确实根本不应该在 C++ 中使用 strtok()std::string 有自己的 find_first_of() and substr() 方法供您使用,例如:

while (std::getline(Info, line))
{
    std::string::size_type start = 0, end;
    while (start < line.size())
    {
        end = line.find_first_of(":.", start);
        if (end == std::string::npos)
        {
            std::cout << line.substr(start) << std::endl;
            break;
        }
        std::cout << line.substr(start, end-start) << std::endl;
        start = end + 1;
    }

    ...
}