C-在参数中找到重复的字符以使用可变长度参数列表函数



该函数必须从参数列表中提供的字符中读取,然后在发现两个相同或达到null字节参数时立即停止。我相信我已经编码了那部分。但是我不明白如何考虑第一个字符" a";它跳过了那个角色,我不知道如何比较两者。

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
char fancyMostFrequentChar(char c, ...);
int main(void)
{
    char c = fancyMostFrequentChar('a', 'b', 'c', 'd', 'd', 'b', 'a', '');
    if (c == 'd')
        printf("Hooray!n");
    else
        printf("fail whale :(n");
    return 0;
}
char fancyMostFrequentChar(char c, ... )
{
    int ci;
    int i;
    int alpha[26] = {0};
    int max = 0;
    int max_i = 0;
    int total = c;
    printf("%dnn", c);
    va_list letters;
    va_start(letters, c);
    while((i = va_arg(letters, int))!= 0)
    {
        ci = i - 97;
        printf("%dn", ci);
    }
    alpha[ci] = c;
    printf("%d", alpha[ci]);
    va_end(letters);
    return total;
}

主文本说'一旦找到两个相同的东西就停止';该代码为" FancyMostFrequentChar",这意味着您必须计算所有字符并报告最常见的字符。不同的操作。

首次重复

第一个,如果alpha[ci]不是零,则发现了重复;返回它(记住va_end)。否则,将alpha[c1]设置为1。对于第二个,您必须处理所有参数,然后找到最频繁的参数。您必须特别处理第一个论点。您不需要检查是否重复;不是。但是您确实需要将alpha中的正确条目设置为1。

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
char first_duplicate(char c, ...);
int main(void)
{
    char c = first_duplicate('a', 'b', 'c', 'd', 'd', 'b', 'a', '');
    if (c == 'd')
        printf("Hooray!n");
    else
        printf("fail whale :(n");
    return 0;
}
static inline int map_char(unsigned char u)
{
    if (isalpha(u))
        return tolower(u) - 'a';
    return 26;
}
char first_duplicate(char c, ...)
{
    int i;
    int alpha[26] = {0};
    va_list letters;
    va_start(letters, c);
    alpha[map_char(c)] = 1;
    while ((i = va_arg(letters, int)) != 0)
    {
        int n = map_char(i);
        if (n != 26 && alpha[n] != 0)
        {
            va_end(letters);
            return n + 'a';
        }
        alpha[n]++;
    }
    va_end(letters);
    return c;   // No duplicates spotted - return first letter
}

最常见的字母

对于最常见的字母,您必须处理整个参数列表,然后找到哪个条目的出现最多。

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
char fancyMostFrequentChar(char c, ...);
int main(void)
{
    char c = fancyMostFrequentChar('a', 'b', 'c', 'd', 'd', 'b', 'a', '');
    if (c == 'a')
        printf("Hooray!n");
    else
        printf("fail whale :(n");
    return 0;
}
static inline int map_char(unsigned char u)
{
    if (isalpha(u))
        return tolower(u) - 'a';
    return 26;
}
char fancyMostFrequentChar(char c, ...)
{
    int i;
    int alpha[26] = {0};
    va_list letters;
    va_start(letters, c);
    alpha[map_char(c)] = 1;
    while ((i = va_arg(letters, int)) != 0)
    {
        int n = map_char(i);
        if (n != 26)
            alpha[n]++;
    }
    va_end(letters);
    int maxval = alpha[0];
    int maxpos = 0;
    for (i = 1; i < 26; i++)
    {
        if (alpha[i] > maxval)
        {
            maxval = alpha[i];
            maxpos = i;
        }
    }
    return maxpos + 'a';
}

运行时都干净地编译并产生Hooray!

请注意,将单个字符串传递给该函数是更明智和合理的,这根本不需要使用<stdarg.h>。它还可以根据用户输入等产生不同的答案。使用变量参数的代码或多或少使用固定的参数列表卡住(尽管如果您愿意,您可能会有不同的变量提供值(first_duplicate(a, b, c, d, e, f, g, '');))。<<<<<<<<<<<<<<<<<</p>

最新更新