查找参数中的重复字符以使用可变长度参数列表进行操作

时间:2017-09-03 18:54:53

标签: c function variadic

该函数必须从参数列表中提供的字符读取,然后在找到两个相同的字符时立即停止,或者当它到达空字节参数时停止。我相信我已经编写了那部分内容。但我无法理解如何解释第一个字符'a';它会跳过那个角色,我无法弄清楚如何比较这两个角色。

/*
	var options = {
		ListTitle: "",
		WebPartID: "",
		DisplayField: "Title",
		EnforceUnique: true,
		AllowEmpty: true,
		RequireSelection: true,
		NoSelectionMessage: "Please Select a Value",
		ConnectedWebPartID: ""
	}
	*/

	//Set Defaults.
	dropdownFilterOptions.DisplayField = (typeof dropdownFilterOptions.DisplayField === "undefined" ? "Title" : dropdownFilterOptions.DisplayField);
	dropdownFilterOptions.EnforceUnique = (typeof dropdownFilterOptions.EnforceUnique === "undefined" ? true : dropdownFilterOptions.EnforceUnique);
	dropdownFilterOptions.AllowEmpty = (typeof dropdownFilterOptions.AllowEmpty === "undefined" ? true : dropdownFilterOptions.AllowEmpty);
	dropdownFilterOptions.RequireSelection = (typeof dropdownFilterOptions.RequireSelection === "undefined" ? true : dropdownFilterOptions.RequireSelection);
	dropdownFilterOptions.NoSelectionMessage = (typeof dropdownFilterOptions.NoSelectionMessage === "undefined" ? "Please select a value." : dropdownFilterOptions.NoSelectionMessage);

	//Parameter Validation.
	var parameterValidationSuccess = true;
	if (typeof dropdownFilterOptions.ConnectedWebPartID === "undefined") {
		throw "ConnectedWebPartID is required!";
		parameterValidationSuccess = false;
	}
	if (typeof dropdownFilterOptions.ListTitle === "undefined") {
		throw "ListTitle is required.";
		parameterValidationSuccess = false;
	}
	if (typeof dropdownFilterOptions.WebPartID === "undefined") {
		throw "WebPartID is required.";
		parameterValidationSuccess = false;
	}
	if (!parameterValidationSuccess) return;

1 个答案:

答案 0 :(得分:1)

主要文字说“一发现两个相同就停止”;代码显示'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', '\0');

    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', '\0');

    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, '\0');)如果你想要的话到)。