打印文件中的前10个重复出现的单词

时间:2018-10-09 02:45:28

标签: c file io segmentation-fault

已编辑的问题: 嗨,大家好,我的目标是打印文件中出现的前10个单词,从读取文件到计数单词出现并进行打印,我已经设法使所有工作正常进行,但是当我实现qsort时,出现了段错误。我看了看指针,它们对我来说还不错,希望得到您的反馈。

df = pd.DataFrame(index=my_datetime_index, columns=['val1', 'val2', 'val3'])
for r in rs:
    try:
        df.loc[r[0]] = r[1:]
    except KeyError:
        pass

3 个答案:

答案 0 :(得分:1)

第一个temp已经是一个指针,因此不要在'&'中包含fscanf。其次,不要忽略缓冲区大小(例如#define MAX 1024)。第三,使用 field-width 修饰符保护数组边界,并且不要在 format-string 中添加尾随空格。

将其全部放入(假设您使用1024 as MAX,则可以使用

fscanf(fpt, "1023%s", temp))

在阅读过程中检查了fscanf的返回情况已经做好了。

答案 1 :(得分:1)

添加已经提到的内容。

createWordCounter(...)

pCounter = (struct words*)malloc(sizeof(char));

您正在为char分配内存。即使指向结构的指针是指向其第一个成员的指针,words的第一个元素也是指向char的指针。最好小心点写

struct words *pCounter = malloc(sizeof *pCounter);

此外,请注意运算符的优先级。 在addWord(...)中,您拥有

++pCounter->index;

该操作是在访问pCounter之前递增指针index。如果您尝试增加index,应该是

++(pCounter->index);

pCounter->index++;

我建议将程序精简为基本内容,并一次系统地测试每个部分,以缩小错误原因的范围。

答案 2 :(得分:0)

我认为主要问题是尝试使用fscanf时temp数组的大小。

while((fscanf(fpt, "%s ", temp)) == 1)

当一行的长度大于MAX时,会出现分段错误。

您可以像这样更改代码

#define SCANF_LEN2(x) #x
#define SCANF_LEN(x) SCANF_LEN2(x)

//...
//your original code
//...

while((fscanf(fpt, "%"SCANF_LEN(MAX)"s ", temp)) == 1)

顺便说一句,您应该检查

(1)编译有关类型的警告

char* removePunc(struct words* ch) 应该是char* removePunc(char *ch)

if(temp == ' ')应该是if(temp[0] == ' ')

if(temp == '\n')应该是if(temp[0] == '\n')

(2)malloc大小

pCounter = (struct words*)malloc(sizeof(char));应该是pCounter = (struct words*)malloc(sizeof(struct words));

(3)使用malloc后请记住