如何从getline进行单词计数?

时间:2016-10-26 01:33:12

标签: c pointers

所以我试图从getline函数获取单词计数,但我不断收到分段错误错误。在这里,您可以假设空格仅定义为'\ t','\ n'和''。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int tokenCount(char *mystring){
    int word=0;
    char *ptr = mystring;
    int i;

    for(i=0; i<strlen(mystring);i++){

            if(ptr[i]!=' ' || ptr[i]!= '\t' || ptr[i]!='\n'){
                    word++;

                    while(ptr[i]!= ' ' || ptr[i]!= '\t' || ptr[i] != '\n'){

                      i++;
                    }
            }

    }


return word;
}

int main (){

    size_t n = 10;
    char *mystring = malloc(10);

    if(mystring==NULL){
            fprintf(stderr, "No memory\n");
            exit(1);
    }

    while(getline(&mystring, &n, stdin)>0){


            printf("%d\n", tokenCount(mystring));
    }

return 0;
}

1 个答案:

答案 0 :(得分:0)

while(ptr[i]!= ' ' || ptr[i]!= '\t' || ptr[i] != '\n'){

所以,在英语中,虽然i的值是空格字符,但 的值为{{ 1}} 不是标签字符, i的值换行符。看到问题?如果iptr[i],则它会通过此测试,因为它不是空格(好)。但是如果它是'a'(空格字符),它仍然会通过,因为它等于' ',它不等于' ' ,所以循环继续(坏)。这是一个无限循环,并且因为它递增'\t',所以你运行数组的末尾,指针引用到未分配的内存并崩溃。

修复测试以使用i,而不是&&,并确保在执行之前没有到达字符串的末尾(同时,将||缓存到一开始,不要一遍又一遍地重新计算:

strlen

稍微改变逻辑(捕获更多空白字符),可以使用isspace简化:

size_t mystringlen = strlen(mystring);

...

if (ptr[i]!= ' ' && ptr[i]!= '\t' && ptr[i] != '\n') {
    ++word;
    while(i < mystringlen && ptr[i]!= ' ' && ptr[i]!= '\t' && ptr[i] != '\n'){

...