在文件中使用C ++中的标记化器?

时间:2013-05-01 03:15:00

标签: c++ tokenize qsort

我正在进行一项任务,要求我从文件中读取几行文本,最后使用qsort按字母顺序对单词进行排序,并显示每个单词使用次数的计数。我意识到我必须将字符串标记为从文件读入它们。唯一的问题是,在您执行此操作后,各个令牌会消失,因此我必须将它们添加到列表中。我不好解释,所以这是我的代码:

#include<iostream>
#include<string>
#include<algorithm>
#include<stdlib.h>
#include<fstream>
using namespace std;

int compare(const void* , const void*);
const int SIZE = 1000;
const int WORD_SIZE = 256;
void main()
{
    cout << "This program is designed to alphabetize words entered from a file." <<     endl;
    cout << "It will then display this list with the number of times " << endl;
    cout << "that each word was entered." << endl;
        cout << endl;
    char *words[SIZE];//[WORD_SIZE];
    char temp[100];
    char *tokenPtr, *nullPtr= NULL;
    char *list[SIZE];
    string word;
    int i = 0, b = 0;
    ifstream from_file;
    from_file.open("prob1.txt.txt");
    if (!from_file)
    {
        cout << "Cannot open file - prob1.txt";
        exit(1);  //exits program
    }

while (!from_file.eof())
{
    from_file.getline(temp, 99);
    tokenPtr = strtok(temp, " ");
    while (tokenPtr != NULL) 
    {
        cout << tokenPtr << '\n';
        list[b] = tokenPtr;
        b++;
        tokenPtr = strtok(nullPtr, " ");
    }
    word = temp;
    transform(word.begin(), word.end(), word.begin(), ::tolower);
    words[i] = list[i];
    i++;
}
from_file.close();
    qsort(words, i, WORD_SIZE, compare);
    int currentcount = 1 ;
int k;
    for( int s = 0; s < i; s++ ) 
{
        for( k = 1; k <= s; k++)
    {
        if( words[s] == words[k] ) 
        {
            currentcount++;
        }
        currentcount = 1;
        words[k] = "";
    }
    cout << words[s] << " is listed: " << currentcount << " times." << endl;
    words[s] = "";

}
}
int compare(const void* p1, const void *p2)
{
char char1, char2;

char1 = *(char *)p1;  // cast from pointer to void
char2 = *(char *)p2;  // to pointer to int

if(char1 < char2)
    return -1;
else
    if (char1 == char2)
        return 0;
    else
        return 1;
}

唯一缺少的是比较功能,但程序工作正常,直到qsort,它崩溃了,但它没有告诉我原因。任何人都可以提供一些见解/帮助我解决这个问题吗?

同样,这是一项任务。 (有人告诉我需要指明这个吗?)

1 个答案:

答案 0 :(得分:1)

数组words是一个指向char的指针数组:

char*   words[SIZE];   // SIZE elements of type `char*`

所以第三个参数WIDTH应该是指向char的指针的宽度。

qsort(words, i, sizeof(char*), compare);

此外,您的比较实施效果不如预期 您正在传递指向比较的指针。但它们是元素的指针。您需要取消引用指针以获取值:

int compare(const void* p1, const void *p2)
{
    char const*  x = *(char**)p1;
    char const*  y = *(char**)p2;

这不会比较字符串:

if( words[s] == words[k] )

这只是比较两个指针。要比较他们指向的字符串使用strcmp()

if( strcmp(words[s], words[k]) == 0)

这可以阻止崩溃,但我们可以做的代码有很多改进:
一旦你开始工作,你应该在https://codereview.stackexchange.com/张贴评论。