我正在进行一项任务,要求我从文件中读取几行文本,最后使用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,它崩溃了,但它没有告诉我原因。任何人都可以提供一些见解/帮助我解决这个问题吗?
同样,这是一项任务。 (有人告诉我需要指明这个吗?)
答案 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/张贴评论。