You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

传递字符数组双指针至函数时出现指针与整数比较警告

解决指针与整数比较的警告及单词计数逻辑问题

咱们先揪出警告的根源,再把你的单词计数逻辑和代码安全性一起理顺~

首先,你遇到的warning: comparison between pointer and integer警告原因非常明确:二级指针的用法完全错了。ptr_double是char**类型(二级指针),*(ptr_double+i)取到的是一个char*(一级指针),而' '是字符类型本质是ASCII整数,拿指针和整数做比较,编译器当然会抛出警告。你真正要访问的是ptr指向的字符数组里的单个字符,得先通过*ptr_double拿到一级指针,再用它去访问数组元素。

除此之外,你的代码还有几个隐性问题:单词计数逻辑错误、使用了不安全/未定义行为的函数,咱们逐一修正:

问题拆解与修正步骤

  1. 修正指针访问方式
    把*(ptr_double+i)改成(*ptr_double)[i]或者*(*ptr_double + i),这样才能正确拿到字符数组里的第i个字符。

  2. 修复单词计数逻辑
    你当前的逻辑会漏统计最后一个单词,而且重复加1导致结果错误。更稳妥的逻辑是:

    • 先跳过开头的空格(如果有的话)
    • 遇到非空格字符时,如果前一个是空格(或者是第一个字符),就计数加1
  3. 替换不安全的函数

    • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:15:47