【问题标题】:splicing cstrings with strtok, only works on first execution of loop用strtok拼接cstrings,仅适用于第一次执行循环
【发布时间】:2013-01-28 17:30:42
【问题描述】:

我正在尝试使用 strtok 将读入 cstring 的行拼接成单个字符串。是的,我知道使用字符串对象可以更轻松地完成此操作,但我不允许使用它们。当此代码执行时,它在第一行完美运行,然后对于循环的每次迭代,它继续只在同一行上运行。文件被成功读入'line'字符数组veriable,由 cout

这是一个代码段,假设所有变量都在别处正确声明

 while(!fin.eof())
    {//while open
    fin.getline(line, 40, '\n');
    cout << line << endl;
    ptr = strtok (line, " ");

    while(ptr != NULL)
        {
        if(c==0)
          sprintf(firstname, "%s", ptr);
        if(c==1)
          sprintf(lastname, "%s", ptr);
        if(c==2)
          sprintf(id, "%s", ptr);
        if(c==3)
          sprintf(grade1, "%s", ptr);
        if(c==4)
          sprintf(grade2, "%s", ptr);
        if(c==5)
          sprintf(grade3, "%s", ptr);
        if(c==6)
          sprintf(grade4, "%s", ptr);
        if(c==7)
          sprintf(grade5, "%s", ptr);
        if(c==8)
          sprintf(grade6, "%s", ptr);
        ptr = strtok (NULL, " ");
        if(ptr == NULL)
          break;
        c++;
        }
}

【问题讨论】:

  • 你的 c++ 很有趣 :-(
  • 你这是什么意思?我是 C++ 新手。我做过的唯一真正的编程是用python。我的学校教 c++,现在突然间我的一位老师决定他不喜欢字符串对象并强迫我们使用 cstrings,而我看不到明显的原因。因此,如果您的意思是我使用 cstrings、sprintf 和 strtok 类型函数而不是流函数和字符串对象,我同意。这很奇怪。
  • 好的,我明白了。您正在练习 C 而不是 C++,但实际上是在编写 C++ :-) 混合风格。除此之外,if 解决方案有点过于“手动”(使用 switch/break ?)......或者只是连续解析......?我想现在你只是想让它工作......
  • strtok 已损坏,永远不应使用。它维护全局状态,这使得任何使用它的程序都无法维护。
  • 另外,while ( fin.eof() ) 是不正确的,就像尝试使用 fin.getline 的结果而不验证它是否成功一样。

标签: c++ c cstring strtok arrays


【解决方案1】:

离开内部循环后,不要重置变量c

【讨论】:

  • 谢谢,我不知道我是怎么错过的。
【解决方案2】:

作为@Joachim Pileborg,主要问题是重置c。在进入内部循环c=0; 之前初始化它可能更明确,并为每个if 添加和else,除了最后一个。

【讨论】:

  • 啊,是的,使用 else if,而不是 just if。对不起,我昨晚写得比较快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
相关资源
最近更新 更多