所以我试图从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;
}
答案 0 :(得分:0)
while(ptr[i]!= ' ' || ptr[i]!= '\t' || ptr[i] != '\n'){
所以,在英语中,虽然i
的值不是空格字符,但 或 的值为{{ 1}} 不是标签字符, 或 i
的值不换行符。看到问题?如果i
为ptr[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'){
...