在我的程序中,我得到了这些输出:

ee

或:
thht

基本上,我想删除副本以获得eth。我有这个密码:
j = 0;
for (i = 1; i < strlen(erros); i++)
{
    if (erros[j] != erros[i])
    {
        erros[j+1] = erros[i];
        j++;
    }
}

这段代码给了我etht。如果在第一种情况下它是好的,在第二种情况下它不是。我相信这是因为我没有一个排序数组。
有没有一种方法,不用对数组进行排序并使用上面的代码,就可以获得所需的输出?

最佳答案

您可以创建一个标记数组,每个标记对应一个可能的字符值。第一次遇到特定字符值时,请设置标志。下次遇到该值时,将设置标志,指示您可以删除该字符。
大致如下(未经测试):

int flags[1 << CHAR_BIT];
memset(flags, 0, sizeof(flags));
j = 0;
for (i = 0; i < strlen(erros); i++)
{
    erros[j] = erros[i];  // Always copy, it's simpler
    if (!flags[erros[i]])
    {
        j++;
    }
    flags[erros[i]] = 1;  // Always set the flag, it's simpler
}
erros[j] = '\0';

注意:您忘记在字符串中设置空终止符。

关于c - C从数组中删除重复的字符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5554769/

10-11 17:21