【发布时间】: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