如何初始化纯空格无冗余字符串?字符校验代码问题求助
解决输入合法字符却重复输出"illegal command"的问题
首先,咱们来定位问题根源:你的代码应该是在遍历整个80长度的字符数组,而非仅用户实际输入的有效字符,再加上判断逻辑没有区分“用户输入内容”和“数组初始化的空字符”,导致后面一堆'\0'被错误判定为非法,从而重复输出提示。
问题拆解
你需求的核心是:只要用户输入的字符中存在任意一个不属于' '、'\t'、'\n'的字符,才输出一次"illegal command"。但原来的代码大概率犯了这两个错误:
- 遍历了整个80位的数组,包括那些初始化后未被输入覆盖的
'\0'; - 对每个非法字符都输出一次提示,而非只要发现非法就输出一次。
修正后的代码
这里给你调整后的代码,完全贴合你的需求:
#include <stdio.h> int main() { // 标准C中main应返回int,尽量避免void main的非标准写法 char str[80] = ""; int i; int has_illegal = 0; // 标记是否存在非法字符 // 读取用户输入,gets_s会自动把换行符替换为'\0' gets_s(str, sizeof(str)); // 只遍历用户实际输入的字符,遇到'\0'就停止 for (i = 0; str[i] != '\0'; i++) { char current_char = str[i]; // 判断当前字符是否不在允许的集合里 if (current_char != ' ' && current_char != '\t' && current_char != '\n') { has_illegal = 1; break; // 发现非法就立刻停止检查,没必要继续遍历 } } // 只有存在非法字符时才输出一次提示 if (has_illegal) { printf("illegal command\n"); } return 0; }
关键优化点
- 只检查有效输入:循环到字符串结束符
'\0'就终止,不会处理数组中未被使用的部分(那些初始化的'\0'),彻底解决了空字符导致的重复输出问题; - 单次提示逻辑:用
has_illegal标记是否存在非法字符,只要发现一个就停止遍历并最终只输出一次提示,更符合你的需求; - 标准兼容性:把
void main改成了标准的int main,避免编译器警告或兼容性问题; - 严谨性:保留了对
'\n'的判断,虽然gets_s会把换行符替换为'\0',但如果后续改用其他输入函数(比如fgets),这个判断依然有效。
为什么原来的代码会出问题?
举个例子,当你输入3个空格加回车时,gets_s会把这3个空格存入数组,然后把回车替换为'\0',数组剩下的76个位置都是初始化的'\0'。如果原来的代码遍历整个80位,并且判断条件错误地把'\0'当成了非法字符(比如你的判断里没把'\0'纳入允许范围),那这76个'\0'就会触发76次输出——这就是你看到的现象。
内容的提问来源于stack exchange,提问作者Or Simhon
相关产品推荐
相关产品推荐

