C程序检测句中首尾同字母单词,p2未初始化报错及优化求助
C语言检测首尾相同单词问题修复方案
报错「uninitialized local variable 'p2' used」原因
你定义了字符指针p2后,没有给它赋值任何有效的内存地址就直接执行*p2 = arr[i--]解引用操作,属于野指针访问,不仅会触发编译警告,运行时也大概率直接崩溃。
除此之外你的代码还存在大量逻辑错误,远不止指针未初始化这一个问题,下面直接给出修复后的可运行代码和改进建议。
现有代码核心问题汇总
- 变量
i未初始化,输入循环直接用i++会把内容写到数组随机位置 - 字符串结束符错误:
arr[i] = '0'是字符0,正确的字符串结束符是'\0' - 指针用法完全错误:
p1、p2是用来指向单词首尾地址的,你直接给*p1赋值相当于修改原数组内容,完全偏离需求 - 比较逻辑写错:
if (*p1 = *p2)是赋值操作,相等判断需要用双等号== - 循环逻辑混乱:查找单词的循环里反复修改
i的值,会导致数组越界、单词拆分错误 - 输出逻辑错误:匹配到符合要求的单词时直接打印整个数组,而不是打印当前匹配的单词
修复后可运行代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define MAX 100 int main() { // 如果不需要切换编码可以删掉这行,中文环境建议用chcp 65001支持中文输入 system("chcp 65001"); char arr[MAX] = {0}; // 初始化数组 int i = 0, sym; printf("\n\t 请输入句子(输入.或者回车结束输入):"); // 读取输入 while ((sym = getchar()) != '.' && sym != '\n' && i < MAX - 1) { arr[i++] = sym; } arr[i] = '\0'; // 补字符串结束符 char *start = arr; // 指向单词开头的指针 while (*start != '\0') { // 跳过开头的分隔符(空格、逗号等非字母字符) while (*start != '\0' && !isalpha(*start)) { start++; } if (*start == '\0') break; // 找到单词结尾 char *end = start; while (*end != '\0' && isalpha(*end)) { end++; } end--; // 回退到最后一个字母的位置 // 判断首尾字母是否相同(要区分大小写的话去掉tolower转换即可) if (tolower(*start) == tolower(*end)) { // 打印当前单词 printf("匹配到首尾相同的单词:"); for (char *p = start; p <= end; p++) { putchar(*p); } putchar('\n'); } // 跳到下一个单词的起始位置 start = end + 1; } return 0; }
代码改进建议
- 可自定义匹配规则:如果要过滤长度为1的单词,加上
if (end - start + 1 < 2) continue;判断即可 - 功能拆分:可以把判断单词首尾相同的逻辑封装成独立函数,提高代码复用性
- 增加异常处理:可以判断输入是否为空、输入长度是否超出数组限制,给出友好提示
- 兼容更多场景:如果需要支持中文单词,替换字母判断逻辑为中文编码判断即可
内容的提问来源于stack exchange,提问作者ansy
相关产品推荐
相关产品推荐

