C语言如何检查字符串仅含0和1?校验修复及32位长度限制循环输入实现
C语言二进制输入合法性校验修复方案
原有代码问题根因
校验逻辑异常原因
你注释了计算字符串长度的for循环,变量i始终保留初始值0,仅校验了字符串第一个字符是否为0/1,没有遍历所有字符,因此只要第一位是0/1,不管后面有没有非法字符都会输出CORRECT。此外原代码开头多余的fgetchar()会丢弃用户输入的第一个字符,也需要删除。
需求实现思路
要同时满足两个校验规则:
- 去空格后的字符串所有字符只能是
'0'或'1' - 去空格后的字符串长度必须等于32
- 用死循环包裹输入逻辑,校验不通过就重复提示输入,校验通过才跳出循环执行后续流程
修复后完整代码
#include <stdio.h> #include <string.h> #define CHAR_SIZE 35 // 去除字符串中所有空格 char *remove_white_spaces(char *str) { int i = 0, j = 0; while (str[i]) { if (str[i] != ' ') str[j++] = str[i]; i++; } str[j] = '\0'; return str; } int main() { char str[CHAR_SIZE]; // 死循环实现重复输入 while(1) { printf("\nKey in input: "); // 读取用户输入,删掉原多余的fgetchar() fgets(str, CHAR_SIZE, stdin); // 去除fgets读取的末尾换行符 str[strcspn(str, "\n")] = '\0'; // 去除空格 remove_white_spaces(str); printf("去空格后内容: %s\n", str); // 第一步:校验长度是否为32 int len = strlen(str); if(len != 32) { printf("Wrong Input: 去空格后长度需为32位,当前长度为%d,请重新输入\n", len); continue; } // 第二步:校验所有字符是否仅为0/1 int is_valid = 1; for(int i = 0; i < len; i++) { if(str[i] != '0' && str[i] != '1') { is_valid = 0; break; } } if(is_valid) { printf("CORRECT\n"); // 校验通过,跳出循环执行后续逻辑 break; } else { printf("Wrong Input: 存在0/1以外的字符,请重新输入\n"); } } // 此处写校验通过后的后续逻辑 return 0; }
代码说明
- 新增了
fgets读取后去除末尾换行符的逻辑,避免换行符被计入字符串 - 先判断长度再判断字符合法性,减少不必要的遍历操作
- 非法输入时会输出具体错误原因,方便用户调整输入
- 只有同时满足长度32、仅含0/1两个条件才会跳出循环
内容的提问来源于stack exchange,提问作者van1234
相关产品推荐
相关产品推荐

