在程序中同时使用 getline 和 strtok 时出现问题

发布于 2024-09-06 01:35:34 字数 592 浏览 6 评论 0原文

在下面的程序中,我打算将文件中的每一行读入字符串,分解字符串并显示各个单词。我面临的问题是,程序现在仅输出文件中的第一行。我不明白为什么会发生这种情况?

#include<iostream>
#include<string>
#include<fstream>
#include<cstdio>
using namespace std;

int main()
{
    ifstream InputFile("hello.txt") ;
    string store ;
    char * token;

    while(getline(InputFile,store))
    {
        cout<<as<<endl;
        token = strtok(&store[0]," ");
        cout<<token;
        while(token!=NULL)
        {
        token = strtok(NULL," ");
        cout<<token<<" ";
        }

    }

}

In the below program , I intend to read each line in a file into a string , break down the string and display the individual words.The problem I am facing is , the program now outputs only the first line in the file. I do not understand why this is happening ?

#include<iostream>
#include<string>
#include<fstream>
#include<cstdio>
using namespace std;

int main()
{
    ifstream InputFile("hello.txt") ;
    string store ;
    char * token;

    while(getline(InputFile,store))
    {
        cout<<as<<endl;
        token = strtok(&store[0]," ");
        cout<<token;
        while(token!=NULL)
        {
        token = strtok(NULL," ");
        cout<<token<<" ";
        }

    }

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

神妖 2024-09-13 01:35:34

我是 C++ 新手,但我认为另一种方法可能是:

while(getline(InputFile, store))
{
    stringstream line(store); // include <sstream>
    string token;        

    while (line >> token)
    {
        cout << "Token: " << token << endl;
    }
}

这将逐行解析文件并根据空格分隔标记每一行(因此这不仅包括空格,例如制表符和新行)。

I'm new to C++, but I think an alternative approach could be:

while(getline(InputFile, store))
{
    stringstream line(store); // include <sstream>
    string token;        

    while (line >> token)
    {
        cout << "Token: " << token << endl;
    }
}

This will parse your file line-by-line and tokenise each line based on whitespace separation (so this includes more than just spaces, such as tabs, and new lines).

握住你手 2024-09-13 01:35:34

嗯,这里有一个问题。 strtok() 接受一个以 null 结尾的字符串,而 std::string 的内容不一定以 null 结尾。

您可以通过调用 c_str()std::string 获取以 null 结尾的字符串,但这会返回 const char* (即该字符串不可修改)。 strtok() 接受一个 char* 并在调用时修改字符串。

如果您确实想使用 strtok(),那么在我看来,最干净的选择是将字符从 std::string 复制到 std: :vector 和以 null 结尾的向量:

std::string s("hello, world");
std::vector<char> v(s.begin(), s.end());
v.push_back('\0');

您现在可以使用向量的内容作为以 null 结尾的字符串(使用 &v[0])并将其传递给 <代码>strtok()。

如果您可以使用 Boost,我建议使用 Boost Tokenizer< /a>.它提供了一个非常干净的接口来标记字符串。

Well, there is a problem here. strtok() takes a null-terminated string, and the contents of a std::string are not necessarily null-terminated.

You can get a null-terminated string from a std::string by calling c_str() on it, but this returns a const char* (i.e., the string is not modifiable). strtok() takes a char* and modifies the string when it is called.

If you really want to use strtok(), then in my opinion the cleanest option would be to copy the characters from the std::string into a std::vector and the null-terminate the vector:

std::string s("hello, world");
std::vector<char> v(s.begin(), s.end());
v.push_back('\0');

You can now use the contents of the vector as a null-terminated string (using &v[0]) and pass that to strtok().

If you can use Boost, I'd recommend using Boost Tokenizer. It provides a very clean interface for tokenizing a string.

旧城烟雨 2024-09-13 01:35:34

詹姆斯·麦克内利斯所说的是正确的。

对于快速解决方案(虽然不是最好的),而不是

string store

使用

const int MAX_SIZE_LINE = 1024; //or whatever value you consider safest in your context.
char store[MAX_SIZE_LINE];

What James McNellis says is correct.

For a quick solution (though not the best), instead of

string store

use

const int MAX_SIZE_LINE = 1024; //or whatever value you consider safest in your context.
char store[MAX_SIZE_LINE];
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文