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


while(!Info.eof()) {
std::getline(Info, line,'r');
char a[line.length()];
char things[]= ":.n";
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输入文件。Line是一个字符串。当我输入cout << line时,它会显示所有内容,没有问题,问题是我需要删除除了所需的字符串和int之外的所有内容,我已经这样做了,但前两行没有显示。当我第一次执行它时,它显示了所有内容,昨天它跳过了第一行,今天跳过了前两行。我猜这和记忆有关,或者是看不见的东西,我需要帮助,谢谢。

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

同样,你的代码中也有错误,即在循环中使用eof(),以及使用非标准的变长数组。

试试这样写:

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;
}
...
}

您缺少一件事—c风格的字符串以末尾的零结束。你不能那样做。

其次,你在while循环之前做了两次击打,这就是为什么你丢失了一些东西。

相关内容

  • 没有找到相关文章

最新更新