C语言检测输入是否含全部大写字母时scanf致无输出问题求解
问题修复方案
你猜对了,程序卡着没输出的核心问题就是scanf用错了,另外还有几个隐藏逻辑bug,改完就能正常跑:
- 格式符完全不匹配:你写的
scanf(" %d", &x)是用来读十进制整数的,遇到非数字的输入就会匹配失败,而且不会移动输入流的读取指针。你输入的测试内容除了末尾的0全是字母、特殊符号,程序第一次执行scanf就卡着等整数输入,永远读不到后面的内容,自然没输出。 - 结束标志判断不对:你输入的结束符是字符'0',它的ASCII值是48,和整数0完全不是一个值,就算改对了读取方式,原来的
x!=0也识别不到结束标记。 - 输出逻辑有问题:原来的代码就算检测到所有大写字母都存在、打印了成功提示,break之后还是会无条件打印失败提示,会同时出两行矛盾结果。
- 数组遍历越界:原来的循环先判断
arr[z]==1再判断z<26,z到26的时候会先访问arr[26]这个数组外的内存,属于未定义行为,跑出来的结果可能随机出错。
修正后的代码
#include <stdio.h> int main() { int z; char x; int arr[26] = {0}; printf("enter a sentance to check if all latter in ABC are in the sentance (in upper case):\n"); while (1) { x = getchar(); if (x == '0') { // 匹配输入的字符'0'结束输入 break; } z = x - 'A'; // 用'A'计算偏移比写死65可读性好,也不会受编码影响 if (z >= 0 && z <= 25) { arr[z] = 1; } } z = 0; while (z < 26 && arr[z] == 1) { z++; } if (z == 26) { printf("all the ABC in ur sentance\n"); } else { printf("all the ABC does not in ur sentance\n"); } return 0; }
用你给的测试串THE Q$@UICK BROWN FOX JUMPS OVER tHe LAZY DOG!0运行,会正确识别出所有大写字母都存在,输出成功提示,串里的小写字母、特殊符号会被自动跳过,不会影响标记结果。
内容的提问来源于stack exchange,提问作者Alfa Hores
相关产品推荐
相关产品推荐

