Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在字符串C指针中循环时出现Seg错误_C_Text_Word_Ctype_String.h - Fatal编程技术网

在字符串C指针中循环时出现Seg错误

在字符串C指针中循环时出现Seg错误,c,text,word,ctype,string.h,C,Text,Word,Ctype,String.h,修复:嘿,当我试图计算文本中的单词时,C中出现了一个奇怪的分段错误。有人能解释一下seg故障的原因和解决方案吗 以下是我的源代码: #include<stdio.h> #include<stdlib.h> #include<string.h> #include<ctype.h> int isword(char *str) { return (isalnum(*(str + 1))) ? 1 : 0; } int main() {

修复:嘿,当我试图计算文本中的单词时,C中出现了一个奇怪的分段错误。有人能解释一下seg故障的原因和解决方案吗

以下是我的源代码:

#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;
}
请注意第二句中空格的过度使用

我还有另一个关于我在
stdin
阅读的问题。有没有更好的方法来实现这一点?我的意思是,我尝试使用
fgets
,但失败了,我知道我不应该使用
gets
(见鬼,如果使用gets,即使是GCC也会给出警告)

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

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



哪条线路导致seg故障?(提示:在调试器中运行代码…)do while导致seg错误。我将编辑问题另一个提示:如果
pos
是指向字符的指针,如何检查它指向的字符是否为
'\0'
?是否为
isword(char*)
内置函数?我对它不熟悉,也无法通过快速的网络搜索找到它。如果不是,你也可以发布代码吗?只是一个提示:只要你
malloc
什么东西,
free
就在最后发布它,只是为了进行良好的编程实践。哪一行导致seg故障?(提示:在调试器中运行代码…)do while导致seg错误。我将编辑问题另一个提示:如果
pos
是指向字符的指针,如何检查它指向的字符是否为
'\0'
?是否为
isword(char*)
内置函数?我对它不熟悉,也无法通过快速的网络搜索找到它。如果不是,你也可以发布代码吗?只是一个提示:只要你
malloc
什么东西,
free
就在最后发布它,只是为了进行良好的编程实践。哪一行导致seg故障?(提示:在调试器中运行代码…)do while导致seg错误。我将编辑问题另一个提示:如果
pos
是指向字符的指针,如何检查它指向的字符是否为
'\0'
?是否为
isword(char*)
内置函数?我对它不熟悉,也无法通过快速的网络搜索找到它。如果不是,你也可以发布代码吗?只是一个提示:只要你
malloc
什么东西,
free
就在最后发布它,只是为了进行良好的编程实践。哪一行导致seg故障?(提示:在调试器中运行代码…)do while导致seg错误。我将编辑问题另一个提示:如果
pos
是指向字符的指针,如何检查它指向的字符是否为
'\0'
?是否为
isword(char*)
内置函数?我对它不熟悉,也无法通过快速的网络搜索找到它。如果不是,你也可以发布代码吗?只是一个提示:无论何时你
malloc
什么东西,
free
在最后发布它只是为了进行良好的编程实践。是的,这是正确的。正如@godel9在评论中所暗示的:D谢谢,但它仍然没有正确计算单词:我认为除了this@DragosRizescu不计算行首的单词。我认为检查行首是否以单词开头应该可以解决它。是的,这是正确的。正如@godel9在评论中所暗示的:D谢谢,但它仍然没有正确计算单词:我认为除了this@DragosRizescu不计算行首的单词。我认为检查行首是否以单词开头应该可以解决它。是的,这是正确的。正如@godel9在评论中所暗示的:D谢谢,但它仍然没有正确计算单词:我认为除了this@DragosRizescu不计算行首的单词。我认为检查行首是否以单词开头应该可以解决它。是的,这是正确的。正如@godel9在评论中所暗示的:D谢谢,但它仍然没有正确计算单词:我认为除了this@DragosRizescu不计算行首的单词。我认为检查行是否以单词开头应该可以解决问题
    pos ? pos++ : pos;
    // pos++;
} while(pos != '\0');
    *pos ? pos++ : pos;
    // pos++;
} while(*pos != '\0');