当我输入The quick brown fox jumps over the lazy dog
时,下面的程序打印not a pangram
。然而,我希望s
是26,并且printf("pangram")
将被执行。我做错了什么?
#include <ctype.h>
#include <stdio.h>
#include <string.h>
char findpan(char arr[]) {
int i, j, count = 0;
for (i = 0; i < strlen(arr); i++) {
if (isalpha(arr[i]))
count++;
}
for (i = 0; i < strlen(arr); i++) {
for (j = i + 1; j < strlen(arr); j++) {
if (arr[i] == arr[j])
count--;
}
}
return (count);
}
int main() {
int s;
char str[60];
fgets(str, 60, stdin);
s = findpan(str);
if (s == 26)
printf("pangram");
else
printf("not a pangram");
return 0;
}
5条答案
按热度按时间lkaoscv71#
如果我已经理解了你想做什么,那么这些嵌套循环
是不正确的。假设你有一个字符串“AAA”。所以在前面的循环之后计数将等于3。
现在在这些嵌套循环之后,count将等于0而不是1。也就是说,当i = 0时,对于j = 1和j = 2,arr[j]等于arr[i]。因此计数将减少两倍。当i = 1时,则对于j = 2,再次arr[j] = arr[i],并且count将再减少一个。
你也应该忽略字母的情况。
我可以建议如下函数实现,如下面的演示程序所示。
程序输出为
如果不使用指针,函数可以如下所示
arknldoa2#
简单解决方案?
这里有一个简单的解决方案,我猜你可能只是想知道它是还是不是一个pangram,所以我把你的函数改成了boolean:
说明
tolower
将arr[j]
char字符转换为小写和,然后将其与i进行比较:stdbool.h
是为了使用bool
而引入的,也就是boolean:2ledvvac3#
限制自己使用纯ASCII,您可以创建一个简单的数组,每个字母一个元素,每个元素初始化为零。然后循环遍历字符串,并为每个字母将其转换为数组的索引,并增加相应的元素值。
输入字符串完成后,循环遍历数组,并为每个非零值增加一个计数器,然后返回该值。
也许是这样的:
对于示例输入(
The quick brown fox jumps over the lazy dog
),它输出这只对输入字符串进行一次遍历,然后对
letters
数组进行一次遍历。没有嵌套循环,没有多次传递输入字符串。am46iovg4#
如果我们假设8位字符,并且可以暂时在堆栈上分配256个字节,那么这是可读的,紧凑的并且相当有效:
256字节的清零可能看起来效率很低,但主流的x86编译器在16条指令中运行它。该函数也不假设
'a'
与'z'
相邻。要添加对大写字母的支持,只需执行used[tolower(*str)]=1;
,尽管这可能会引入大量分支。测试代码:
u0sqgete5#
要检查一个字符串是否是一个Pangram,即它是否包含英语字母表中的所有字母,那么你可以检查下面的步骤如何在C中实现这一点。
1.初始化一个包含英语字母表中所有字符的大小为26的布尔数组,并将其设置为false。
1.循环遍历输入字符串中的字符,并在上面声明的数组中将该字符的索引设置为true。
1.循环遍历上面修改过的布尔数组,并检查是否有任何值为false。如果任何索引处的值为false,则向调用函数返回false。
1.在上面的循环之外返回一个真布尔值,如果数组中没有任何值为假,则将到达该语句。
分析下面的C代码以获得更多细节。
你可以用来检查输入字符串是否是pangram的最常见的输入字符串是The quick brown fox jumps over the lazy dog。