我需要从用户的10个单词中获取,然后告诉他放入的句子是否是pangram。我的代码不能像我期望的那样工作。我没有发现问题是,如果有人能告诉我问题所在,我会非常感谢pangram的例子:“敏捷的棕色狐狸跳过懒惰的狗”“油腔滑舌的运动员测验小仙女”,这是我的代码
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#define MAX_NAMES 10
#define LONG 50
int main()
{
char names[MAX_NAMES][LONG] = {0};
bool flage = true;
int i = 0, j = 0, k = 0;
char allAlphabet[] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
int countAlfa = 0;
printf("Enter up to 10 words, try to make a pangram:\n");
for(i = 0; (i < MAX_NAMES) && (flage == true); i++)
{
fgets(names[i], LONG, stdin);
names[i][strcspn(names[i], "\n")] = 0;
for(j = 0; (k < strlen(names[i])) && (j < strlen(allAlphabet)); j++)
{
if(names[i][k] == allAlphabet[j])
{
countAlfa++;
allAlphabet[j] = '#';
k++;
j = 0;
}
}
k = 0;
if(countAlfa > 25)
{
printf("It's a pangram?\n");
printf("Yes\n");
flage = false;
}
}
if(countAlfa < 26)
{
printf("It's a pangram?\n");
printf("No\n");
}
}
发布于 2021-02-09 00:08:38
正如Jonathan Leffler所指出的,有一种更好的方法可以做到这一点,那就是使用初始化为全零的26个计数器的数组。
然后,当您遍历字母时,您将增加相应的计数器,可以使用字符值轻松访问该计数器。
这是一个小的概念证明。我假设名称的末尾总是有一个空指针的N+1元素
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define FALSE (0 != 0)
#define TRUE (!FALSE)
#define MAX_NAMES 10
#define LONG 50
int main()
{
char names[MAX_NAMES][LONG] = { "The", "quick", "brown", "Fox", "jumps", "over", "the", "lazy", "Dog" };
char flag = TRUE;
int i = 0, j = 0;
char allAlphabet['z' - 'a' + 1] = {0}; // The size is constant and calculated at compile time
while (*names[i] != 0)
{
for (j = 0; j < strlen(names[i]); j++)
{
int letter = tolower(names[i][j]);
if (letter >= 'a' && letter <= 'z')
allAlphabet[letter - 'a']++; // The letter is used to access the counter
}
i++;
}
for (i = 0; i < sizeof(allAlphabet); i++)
{
if (allAlphabet[i] == 0)
{
printf("%c is missing\n", i + 'A');
flag = FALSE;
break;
}
}
printf("It's a pangram?\n%s\n", flag ? "Yes" : "No");
}
编辑:我在最后一次检查中使用了反转逻辑。我喜欢它,但它让事情变得更难理解。感谢罗伯托·卡博尼指出这一点
https://stackoverflow.com/questions/66103943
复制相似问题