【问题标题】:why does the first 2 chars get skipped when executing? C++为什么执行时会跳过前 2 个字符? C++
【发布时间】:2021-10-25 18:25:19
【问题描述】:
while(!Info.eof()) {
    std::getline(Info, line,'\r');

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

    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 &lt;&lt; line 它显示一切都没有问题时,问题是我需要带走除了所需的字符串和 int 之外的所有东西,我已经这样做了,但前两行没有显示。当我第一次执行它时,它显示了所有内容,昨天它跳过了第一行,今天跳过了前两行。我想这与记忆或看不见的东西有关,我需要帮助,谢谢。

【问题讨论】:

标签: c++ arrays memory char strtok


【解决方案1】:

好吧,首先,您在第一次打印 cout 之前调用了 3 次 strtok()。所以你跳过了前几个子字符串。

另外,您的代码中有错误,即using eof() in a loopusing 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()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;
    }

    ...
}

【讨论】:

  • 救命稻草,使用 substr() 更容易理解
  • 如何提取信息以将它们放入结构参数中?
  • 字符串数组/向量比单个结构成员更有意义。但是,如果您真的需要单个成员,则必须展开循环并为每个结构成员单独调用 strtok()/substr()。或者至少先将子字符串存储到数组/向量中,然后根据需要将其条目单独读取到结构成员中。您没有为您的问题提供任何背景信息,因此很难告诉您哪种方法最适合您的情况。
  • 要求是我们有 3 个文件需要 ifstream 来提取输入。我们需要对 3 个文件使用随机性,并且在随机性之后进行一些计算。初始化这3个文件后,我们需要将文件中的内容放入变量中,以便能够在随机性之后进行随机性和计算
  • 您不认为提前提供这些信息会很好吗?尤其是文件数据实际是什么样子,需要如何使用?
【解决方案2】:

您缺少的一件事——C 风格的字符串以零结尾。你没有这样做。

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

【讨论】:

  • 对不起,但我是初学者,我拿走了一个 strtok ,它只是缺少第一行。我知道一个 char 持有 /0 但不知道如何添加或删除它,我尝试将数组长度增加 1 和 2 以便它可以显示但没有用。
猜你喜欢
  • 1970-01-01
  • 2014-06-04
  • 1970-01-01
  • 2019-01-13
  • 1970-01-01
  • 2015-02-26
  • 1970-01-01
  • 1970-01-01
  • 2020-08-12
相关资源
最近更新 更多