列出数组中没有重复的字符

时间:2014-01-18 14:46:03

标签: c arrays

嗯,我的问题很简单,但我已经被困了很长一段时间。我想编写一个程序,它接受两个数组作为参数,然后按照出现的顺序在其中写入不重复的字母。

示例:

$ ./a.out bulwark blue
bulwarke

$ ./a.out fresh feeling
freshling

$ ./a.out final01 test02
final01tes2

我尝试了几种方法,但如果没有malloc则无法确定如何做到这一点。棘手的是,我不能使用malloc,唯一授权的功能是“写”

P.S:抱歉我的英文不好

2 个答案:

答案 0 :(得分:1)

使用辅助数组指示已使用的字母:

void func(char arr1[],char arr2[])
{
    int hash[256] = {0};
    for (int i=0; arr1[i]!=0; i++)
    {
        unsigned char letter = (unsigned char)arr1[i];
        if (hash[letter] == 0)
        {
            hash[letter] = 1;
            printf("%c",letter);
        }
    }
    for (int i=0; arr2[i]!=0; i++)
    {
        unsigned char letter = (unsigned char)arr2[i];
        if (hash[letter] == 0)
        {
            hash[letter] = 1;
            printf("%c",letter);
        }
    }
    printf("\n");
}

注意:此代码假定每个输入字符串(arr1arr2)以0字符终止。

答案 1 :(得分:0)

只需跟踪您打印的内容即可。以下内容适用于char,因为它们很少。使用足够长的数组跟踪unicode字符以获取所有可能的值将是疯狂的。在这种情况下,将标识符插入散列可能是更好的选择,但由于unicode不是考虑因素的一部分,因此以下内容应该足够好。

#include <stdio.h>
int main(int argc, char **argv)
{
    char arr[256] = { 0 };
    int i, j;

    for (i = 1; i < argc; i++)
        for (j = 0; argv[i][j]; j++)
            if (!arr[argv[i][j]]) {
                arr[argv[i][j]] = 1;
                printf("%c", argv[i][j]);
            }
    putchar('\n');
    return 0;
}