如何检查用户提供的输入中是否存在所有大写字母?
How to check if all the upper-case letters are present in the input the user gives?
我正在尝试检查用户输入的内容中是否存在所有大写字母。
我尝试创建一个包含 26 个值的数组,0 表示 A,25 表示 Z。首先我将值初始化为 0。
之后我要求用户输入,然后检查它是否与 ASCII 匹配。如果是,我将数组值更改为 1.
之后,我确保所有的数组值都是1;如果是,所有字母都在输入中。
我假设用户将以 0 结束输入。
输入是“Q$@UICK BROWN FOX JUMPS OVER tHe LAZY DOG!0”。
这是代码:
#include <stdio.h>
int main()
{
int z;
int x = 1;
int arr[26] = {0};
printf("enter a sentance to check if all latter in ABC are in the sentance (in upper case):\n");
while (x!=0) {
scanf(" %d", &x);
z = x - 65;
if (z>=0 && z<=25) {
arr[z]=1;
}
}
z=0;
while (arr[z]==1 && z<26) {
++z;
if (z==26) {
printf("all the ABC in ur sentance\n");
break;
}
}
printf("all the ABC does not in ur sentance\n");
return 0;
}
没有输出,我想是因为scanf有问题,但我不知道如何解决。
%d
scanf()
中的格式说明符用于读取整数,而不是字符。在这种情况下,您应该使用 getchar()
而不是 scanf()
来读取字符 one-by-one.
- 字符
0
没有值 0。(在 ASCII 中为 48)。
- 使用
65
这样的幻数并不好。在这种情况下,使用像 'A'
这样的字符常量应该可以使意思清楚。
部分
while (x!=0) {
scanf(" %d", &x);
z = x - 65;
if (z>=0 && z<=25) {
arr[z]=1;
}
}
应该是:
while ((x = getchar()) != '0' && x != EOF) {
z = x - 'A';
if (z>=0 && z<=25) {
arr[z]=1;
}
}
另请注意,即使在打印 "all the ABC in ur sentance\n"
之后,也会打印 "all the ABC does not in ur sentance\n"
。您应该使用 return 0;
而不是 break;
来完成函数的执行并防止输出额外的字符串。
您需要使用%c
来读取一个字符并将其转换为字符代码。 %d
读取整数的表示。
如果字符0
结束输入,则需要与'0'
比较,而不是0
。
您可以使用 isupper()
来测试一个字符是否为大写字母,而不用自己测试范围。
检查是否输入了所有字符的循环可以简化,如下所示。
#include <stdio.h>
#include <ctype.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) {
scanf(" %c", &x);
if (x == '0') {
break;
}
if (isupper(x)) {
z = x - 'A';
arr[z]=1;
}
}
for (z = 0; z < 26; z++) {
if (arr[z] == 0) {
printf("all the ABC are not in your sentance\n");
return 0;
}
}
printf("all the ABC in your sentance\n");
return 0;
}
我正在尝试检查用户输入的内容中是否存在所有大写字母。
我尝试创建一个包含 26 个值的数组,0 表示 A,25 表示 Z。首先我将值初始化为 0。
之后我要求用户输入,然后检查它是否与 ASCII 匹配。如果是,我将数组值更改为 1.
之后,我确保所有的数组值都是1;如果是,所有字母都在输入中。
我假设用户将以 0 结束输入。
输入是“Q$@UICK BROWN FOX JUMPS OVER tHe LAZY DOG!0”。
这是代码:
#include <stdio.h>
int main()
{
int z;
int x = 1;
int arr[26] = {0};
printf("enter a sentance to check if all latter in ABC are in the sentance (in upper case):\n");
while (x!=0) {
scanf(" %d", &x);
z = x - 65;
if (z>=0 && z<=25) {
arr[z]=1;
}
}
z=0;
while (arr[z]==1 && z<26) {
++z;
if (z==26) {
printf("all the ABC in ur sentance\n");
break;
}
}
printf("all the ABC does not in ur sentance\n");
return 0;
}
没有输出,我想是因为scanf有问题,但我不知道如何解决。
%d
scanf()
中的格式说明符用于读取整数,而不是字符。在这种情况下,您应该使用getchar()
而不是scanf()
来读取字符 one-by-one.- 字符
0
没有值 0。(在 ASCII 中为 48)。 - 使用
65
这样的幻数并不好。在这种情况下,使用像'A'
这样的字符常量应该可以使意思清楚。
部分
while (x!=0) {
scanf(" %d", &x);
z = x - 65;
if (z>=0 && z<=25) {
arr[z]=1;
}
}
应该是:
while ((x = getchar()) != '0' && x != EOF) {
z = x - 'A';
if (z>=0 && z<=25) {
arr[z]=1;
}
}
另请注意,即使在打印 "all the ABC in ur sentance\n"
之后,也会打印 "all the ABC does not in ur sentance\n"
。您应该使用 return 0;
而不是 break;
来完成函数的执行并防止输出额外的字符串。
您需要使用%c
来读取一个字符并将其转换为字符代码。 %d
读取整数的表示。
如果字符0
结束输入,则需要与'0'
比较,而不是0
。
您可以使用 isupper()
来测试一个字符是否为大写字母,而不用自己测试范围。
检查是否输入了所有字符的循环可以简化,如下所示。
#include <stdio.h>
#include <ctype.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) {
scanf(" %c", &x);
if (x == '0') {
break;
}
if (isupper(x)) {
z = x - 'A';
arr[z]=1;
}
}
for (z = 0; z < 26; z++) {
if (arr[z] == 0) {
printf("all the ABC are not in your sentance\n");
return 0;
}
}
printf("all the ABC in your sentance\n");
return 0;
}