指针算术实现点计数: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
相关产品推荐
相关产品推荐

