C语言实现打印字母表中未出现在猜测字符中的剩余字符问题
代码问题分析
- 可用字符存储索引错误:原代码使用字母表的遍历下标
i作为available_character的赋值索引,已猜中字母对应的数组位置不会被赋值,会残留初始垃圾值,同时可用字符之间会出现空位。 - 判断逻辑位置错误:判断当前字母是否可用的逻辑放在了内层循环内部,还未遍历完所有已猜字符就会提前执行赋值,逻辑完全错误。
- 字符串缺少结束符:C语言要求字符串必须以
\0结尾,原代码赋值完可用字符后没有主动添加结束符,printf打印时会读取数组后方的垃圾内存,导致输出乱码。
修复方案
- 新增独立的可用字符索引变量,每次确认字母可用时才对该索引自增
- 将可用判断逻辑移到内层循环结束后,遍历完所有已猜字符再做判断
- 所有可用字符赋值完成后,主动在数组末尾添加
\0作为字符串结束标记
修复后完整代码
#include <stdio.h> #include <string.h> void letters(const char gussed_character[], char available_character[]){ char alphabet[] = "abcdefghijklmnopqrstuvwxyz"; int gussed_len = strlen(gussed_character); int alpha_len = strlen(alphabet); int avail_idx = 0; for(int i = 0; i < alpha_len; i++){ int is_available = 1; for(int j = 0; j < gussed_len; j++){ if(alphabet[i] == gussed_character[j]){ is_available = 0; break; } } if(is_available){ available_character[avail_idx++] = alphabet[i]; } } available_character[avail_idx] = '\0'; printf("%s", available_character); } int main(){ char result[30]; letters("arpstxgoieyu", result); }
运行输出
bcdfhjklmnqvwz
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

