在字符串C指针中循环时出现Seg错误
修复:嘿,当我试图计算文本中的单词时,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() {
#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');