字符串C指针循环时的段错误

时间:2013-12-08 17:45:45

标签: c text word ctype string.h

FIXED:嘿,当我试图计算文本中的单词时,我在C中遇到了这个奇怪的分段错误。任何人都可以解释为什么和seg-fault的解决方案?

这是我的源代码:

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

int isword(char *str) {
    return (isalnum(*(str + 1))) ? 1 : 0;
}

int main() {
    char **text, c;
    int n, i, j;

    //reading from stdin & allocating it dynamically
    scanf("%d\n", &n);
    text = malloc(n * sizeof(char *));
    for(i = 0; i < n; i++) {
        text[i] = malloc(200 * sizeof(char));
    }

    for(i = 0; i < n; i++) {
        for(j = 0; ; j++) {
            scanf("%c", &c);
            if(c == '\n') {
                break;
            }
            text[i][j] = c;
        }
    }

    // Counting words
    int word_counter = 0;
    char *delimitor = " ";
    char *pos;
    for(i = 0; i < n; i++) {
        pos = text[i];
        do {
            if(isspace(*pos) && isword(pos)) {
                word_counter++;
            }
            pos ? pos++ : pos;
            // pos++;
        } while(*pos != '\0');
    }

    printf("Number of words: %d\n", word_counter);
    return 0;
}

输入示例:

4
Adam baked a pie.
Mary   went         to a movie
Mark goes like ?? him
Gina is, hot

请注意第二句中过多使用空格。

我还有一个关于我从stdin阅读的问题。有没有更好的方法来实现这一目标?我的意思是我尝试用fgets来做,但是我失败了,我知道我不应该使用gets(如果你使用获取,即使是GCC也会将其作为警告)。

另一个问题:为什么不打印预期的字数?它打印12而不是14?

1 个答案:

答案 0 :(得分:3)

    pos ? pos++ : pos;
    // pos++;
} while(pos != '\0');

    *pos ? pos++ : pos;
    // pos++;
} while(*pos != '\0');