gpt4 book ai didi

c - 如何从 getline 进行字数统计?

转载 作者:行者123 更新时间:2023-11-30 19:37:08 24 4
gpt4 key购买 nike

所以我试图从 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;
}

最佳答案

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

因此,在英语中,虽然 i 处的值不是空格字符,但该值i不是制表符,i处的值是< em>不是换行符。看到问题了吗?如果 ptr[i]'a',则它通过此测试,因为它不是空格(好)。但如果它是 ' ' (空格字符),它仍然会通过,因为虽然它等于 ' ',但它不等于 '\t',因此循环继续(不好)。这是一个无限循环,由于它递增 i,因此您会超出指针引用的数组末尾,进入未分配的内存并崩溃。

修复测试以使用 &&,而不是 ||,并确保在执行之前尚未到达字符串末尾(另外,缓存 strlen 在开头,不要一遍又一遍地重新计算):

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'){

...

通过轻微的逻辑更改(捕获更多空白字符),可以使用 isspace 进行简化:

if (!isspace(ptr[i])) {
++word;
while(i < mystringlen && !isspace(ptr[i])){

关于c - 如何从 getline 进行字数统计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40252324/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com