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

指针算术实现点计数:if语句未触发及程序错误排查求助

排查你的指针算术统计代码问题

我来帮你揪出代码里的几个核心问题,这些就是导致你没法触发if语句、main函数打印不出正确内容的根源:

1. 空指针导致的非法访问

在main函数里,你写了int*p_dots=0;——这是把指针直接指向了内存地址0(空指针),后续*p_dots去解引用这个地址的时候,要么程序崩溃,要么完全没法正确存储统计结果。正确的做法是先定义一个普通的int变量来存点数,再把它的地址传给函数:

int dots = 0;
analyse(code, &dots); // 直接传变量的地址

2. 指针算术的理解错误

你在analyse函数里写的(*current + k)完全搞错了逻辑:这是把当前指针指向的字符的ASCII值加上k,而不是移动指针去访问第k个位置的字符!正确的写法应该是*(current + k)(或者更直观的current[k]),或者通过current++来逐个移动指针遍历字符串。

3. 缺少循环遍历逻辑

你的analyse函数只检查了一次字符就结束了,根本没遍历整个输入字符串!必须用循环,直到遇到字符串结束符'\0'为止,才能统计所有的点。

4. 修改指针指向变量的方式错误

你要修改的是指针p_dots指向的int变量的值,所以应该写(*p_dots)++,而不是p_dashes++;(不仅变量名写错,而且直接动指针本身毫无意义)。

修正后的完整代码

#include <stdio.h>
#include <string.h>

// 按照要求的函数原型(这里先保留只统计dots的版本,后续可以加dashes)
void analyse(char* code, int* p_dots) {
    char *current = code;
    // 循环遍历整个字符串,直到遇到结束符
    while (*current != '\0') {
        if (*current == '.') {
            (*p_dots)++; // 修改指针指向的变量的值
        }
        // 短横线和空格直接跳过,继续下一个字符
        current++; // 移动指针到下一个位置(指针算术的正确用法)
    }
}

int main(void) {
    char* morse[] = {
        "... --- ..." // SOS
        // "-- --- .-. ... .", // MORSE
        // "-.-. --- -.. .", // CODE
        // "-.-. --- -- .--. ..... ----- -----", // COMP500
        // ". -. ... . ..... ----- .----" // ENSE501
    };
    char* code = *morse;
    int dots = 0; // 定义普通变量存储点数
    analyse(code, &dots); // 传变量的地址给函数
    printf("Line 1 has %d dots\n", dots);
    return 0;
}

额外说明

如果后续要加上统计短横线的功能,只需要修改函数原型为void analyse(char* code, int* p_dots, int* p_dashes);,然后在循环里增加判断:

if (*current == '-') {
    (*p_dashes)++;
}

同时在main里定义int dashes = 0;,调用函数时传&dashes即可。

内容的提问来源于stack exchange,提问作者UltraInstinctMessi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 16:23:19