首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C程序检查句子是否为pangram(包含所有字母的句子)

C程序检查句子是否为pangram(包含所有字母的句子)
EN

Stack Overflow用户
提问于 2021-02-08 22:54:45
回答 1查看 248关注 0票数 0

我需要从用户的10个单词中获取,然后告诉他放入的句子是否是pangram。我的代码不能像我期望的那样工作。我没有发现问题是,如果有人能告诉我问题所在,我会非常感谢pangram的例子:“敏捷的棕色狐狸跳过懒惰的狗”“油腔滑舌的运动员测验小仙女”,这是我的代码

代码语言:javascript
运行
复制
#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");
    }
}
EN

回答 1

Stack Overflow用户

发布于 2021-02-09 00:08:38

正如Jonathan Leffler所指出的,有一种更好的方法可以做到这一点,那就是使用初始化为全零的26个计数器的数组。

然后,当您遍历字母时,您将增加相应的计数器,可以使用字符值轻松访问该计数器。

这是一个小的概念证明。我假设名称的末尾总是有一个空指针的N+1元素

代码语言:javascript
运行
复制
#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://www.jdoodle.com/iembed/v0/91G

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66103943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档