传递字符数组双指针至函数时出现指针与整数比较警告
解决指针与整数比较的警告及单词计数逻辑问题
咱们先揪出警告的根源,再把你的单词计数逻辑和代码安全性一起理顺~
首先,你遇到的warning: comparison between pointer and integer警告原因非常明确:二级指针的用法完全错了。ptr_double是char**类型(二级指针),*(ptr_double+i)取到的是一个char*(一级指针),而' '是字符类型本质是ASCII整数,拿指针和整数做比较,编译器当然会抛出警告。你真正要访问的是ptr指向的字符数组里的单个字符,得先通过*ptr_double拿到一级指针,再用它去访问数组元素。
除此之外,你的代码还有几个隐性问题:单词计数逻辑错误、使用了不安全/未定义行为的函数,咱们逐一修正:
问题拆解与修正步骤
修正指针访问方式
把*(ptr_double+i)改成(*ptr_double)[i]或者*(*ptr_double + i),这样才能正确拿到字符数组里的第i个字符。修复单词计数逻辑
你当前的逻辑会漏统计最后一个单词,而且重复加1导致结果错误。更稳妥的逻辑是:- 先跳过开头的空格(如果有的话)
- 遇到非空格字符时,如果前一个是空格(或者是第一个字符),就计数加1
替换不安全的函数
fflush(stdin)是C标准里的未定义行为,绝对不要用gets已经被C标准废弃,换成fgets更安全,同时要处理fgets读取到的换行符
修正后的完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> void word_counter(char **ptr_double, int len) { int count = 0; // 标记当前是否处于单词中 int in_word = 0; for (int i = 0; i < len; i++) { char c = (*ptr_double)[i]; if (c != ' ') { if (!in_word) { // 从空格切换到单词,计数加1 count++; in_word = 1; } } else { // 遇到空格,标记为不在单词中 in_word = 0; } } printf("The number of words is %d\n", count); } int main() { char sentence[100]; char *ptr = sentence; char **ptr_double = &ptr; printf("Enter a sentence\n"); // 用fgets替代gets,避免缓冲区溢出风险 fgets(*ptr_double, sizeof(sentence), stdin); // 去掉fgets读取到的换行符 (*ptr_double)[strcspn(*ptr_double, "\n")] = '\0'; puts(*ptr_double); int len = strlen(*ptr_double); word_counter(ptr_double, len); return 0; }
额外小建议
如果你只是要传递字符数组,其实没必要用二级指针,直接传一级指针char*会更简单,比如把函数改成void word_counter(char *str, int len),调用时传ptr或者sentence就行,代码会更清晰易读。
内容的提问来源于stack exchange,提问作者Lodger
相关产品推荐
相关产品推荐

