从用户输入生成有序唯一字符数组(唯一字符串)问题排查
修复按输入顺序保留唯一字符的C语言函数问题
你的代码目前输入后无任何输出,核心原因是逻辑错误与未初始化数组导致的,以下是问题分析与修复方案:
原代码的问题点
- 未初始化目标数组:
updated_string作为局部数组,默认填充垃圾值,strchr查找时会得到不可预期的结果 - 逻辑完全颠倒:当前逻辑是"找到字符时才添加",但实际需求是"未出现过的字符才添加",导致符合要求的字符根本不会被写入
- 缺少字符串结束符:即使逻辑正确,
updated_string最后没有加'\0',后续打印或返回操作会读取到垃圾内容 - 函数设计不符合需求:需求是返回唯一字符数组,但当前函数为
void类型,仅尝试打印且打印逻辑错误
修复后的代码
#include <stdio.h> #include <stdlib.h> #include <string.h> // 将处理后的结果存入传入的output缓冲区 void unique_string(const char* input, char* output) { int counter = 0; // 初始化输出数组为全0,避免垃圾值干扰查找 memset(output, 0, 251); for (int i = 0; i < strlen(input); ++i) { char current_char = input[i]; // 仅当字符未在结果数组中出现过时,才添加进去 if (strchr(output, current_char) == NULL) { output[counter] = current_char; counter++; } } } int main() { char input[251]; char result[251]; scanf("%s", input); unique_string(input, result); printf("%s\n", result); return 0; }
关键修改说明
- 初始化数组:用
memset将output初始化为全0,确保strchr能正确判断字符是否已存在 - 修正逻辑判断:仅当
strchr返回NULL(字符未出现过)时,才将字符加入结果数组 - 调整函数参数:新增
output参数存储结果,符合"返回唯一字符数组"的需求(也可改为动态分配内存返回,缓冲区方式更简洁) - 保障字符串完整性:
memset初始化时已将数组末尾设为'\0',也可在循环结束后手动添加output[counter] = '\0'
测试验证:
- 输入
Joooooooe,输出Joe - 输入
Rooooobert,输出Robert - 输入
Aalllbbert,输出Albert - 输入
Duuuccck,输出Duck
内容的提问来源于stack exchange,提问作者ArbIn
相关产品推荐
相关产品推荐

