1

我一直在搞乱这段代码几个小时,正在寻找一些建议。我正在使用 strtok 从字符串中获取单词,但我不断在每一行的末尾获取额外的数据。我有以下代码:

cout << "\n\n6. Load File:\n";
        getline(cin, inFile);
        inFile = path + inFile;
        myfile.open(inFile.c_str());
            while (myfile.is_open() == false)   //check to make sure file exists
            {
                cout << "\nPlease enter in a valid file name: ";
                getline(cin,inFile);
                inFile = path + inFile;
                myfile.open(inFile.c_str());
            }
                getline (myfile,line);
                while ( myfile.good() )     //while the file is running, run below code
                {
                    getline (myfile,line);
                    //cout << line;
                    char str[line.length()];
                    char * pch;
                    for (int i=0;i<line.size();i++) { //creates a char array from characters
                        str[i]=line[i];
                    }
                    pch = strtok(str," ,-!?\r\t\f\v\n\0|/\\_"); //eliminates whitespace,etc in char array
                    while (pch != NULL)
                    {
                        printf ("%s\n",pch);
                        pch = strtok (NULL, " ,-!?\r\t\f\v\n\0|/\\_");  //grabs next word
                    }

                }
        myfile.close();

现在这段代码给了我我想要的单词输出,但在每一行的末尾都有来自内存的随机疯狂值。见下文:

加载文件:
cars1.txt
Jalopy
Blue
3402.99 \244\363P
Rustbucket
Brown
44.99 P
Lemon
Yellow
4226.99 99P

请帮助,非常感谢!

4

2 回答 2

1

在中,字符串的末尾C必须有(0)。NUL你需要添加它。

(这也意味着\0您的令牌字符串中的 被视为该字符串的结尾,并且将忽略以下字符。这将符合您对空格的评论,但它可能不是您真正想要的。)

最简单的解决方案:用于strdup复制您的字符串。

char* tmp_copy = strdup(line.c_str());
for (char* pch = strtok(tmp_copy," ,-!?\r\t\f\v\n\0|/\\_");
     pch;
     pch = strtok (NULL, " ,-!?\r\t\f\v\n\0|/\\_")) {
   printf ("%s\n",pch);
}
free(tmp_copy);

更好的解决方案:使用boost::tokenizer

于 2013-03-17T04:09:49.377 回答
0

您需要空终止str。您一次复制linestr一个字符,但不是终止的空值。

试试这个:

char str[line.length()+1];
char * pch;
for (int i=0;i<line.size();i++) {
    str[i]=line[i];
}
str[line.size()+1] = '\0';     // null terminator

或者更简单,只需初始化str

char str[line.length()+1] = {};  // initialize to all nulls
char * pch;
for (int i=0;i<line.size();i++) {
    str[i]=line[i];
}
于 2013-03-17T04:03:28.180 回答