该函数必须从参数列表中提供的字符中读取,然后在发现两个相同或达到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>