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
ジャロピー
ブルー
3402.99 \244\363P ラスト
バケット
ブラウン
44.99 P
レモン
イエロー
4226.99 99P

助けてください、そしてどうもありがとう!

4

2 に答える 2

1

ではC、文字列NULの末尾に (0) が必要です。それを追加する必要があります。

(これは\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

null で終了する必要がありますstr。一度に 1 文字ずつコピーlineしてstrいますが、終端の null にはコピーしていません。

これを試して:

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 に答える