为什么执行时会跳过前 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;
}
...
}
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;
}
...
}