从字符数组中删除常用字母的程序

时间:2016-10-07 19:42:27

标签: c

void main()
{
    int i, j, k,flag=1;
    char key[10], keyword[10];
    gets(key);
    i=0;
    j=0;
    while(key[i]!='\0') {
        k=0;
        while(keyword[k]!='\0') {
            if(key[i]==keyword[k]) {
                i++;
                flag=0;
                break;
            }
            k++;
        }
        if(flag==1) {
            keyword[j]=key[i];
            j++;
            i++;
        }
        flag=1;
    }
}

在这里,我尝试将独特的字母表从数组复制到另一个数组..意思是重复的字母表不应该复制到另一个数组中..它显示正确的输出,但同时显示一些垃圾值,如笑脸或其他东西直到原始长度输入数组(iekey [])

1 个答案:

答案 0 :(得分:0)

您需要在初始化时为唯一字符串 添加终结符,并且每次添加新字母时都需要:

#include <stdio.h>

int main() {
    int i = 0, j = 0;
    char redundant[10], unique[10] = { '\0' };

    gets(redundant);

    while (redundant[i] != '\0') {
        int k = 0, flag = 1;

        while (unique[k] != '\0') {
            if (redundant[i] == unique[k]) {
                flag = 0;
                break;
            }
            k++;
        }

        if (flag) {
            unique[j++] = redundant[i];
            unique[j] = '\0';
        }

        i++;
    }

    printf("%s -> %s\n", redundant, unique);

    return(0);
}

输出

% ./a.out
warning: this program uses gets(), which is unsafe.
aardvark
aardvark -> ardvk
%

现在让我们考虑一种不同的方法,浪费一些空间来简化和加速代码:

#include <stdio.h>
#include <string.h>

int main() {
    unsigned char seen[1 << (sizeof(char) * 8)] = { 0 }; // a flag for every ASCII character
    char redundant[32], unique[32];

    (void) fgets(redundant, sizeof(redundant), stdin); //  gets() is unsafe

    redundant[strlen(redundant) - 1] = '\0'; // toss trailing newline due to fgets()

    int k = 0; // unique character counter

    for (int i = 0; redundant[i] != '\0'; i++) {
        if (!seen[(size_t) redundant[i]]) {
            unique[k++] = redundant[i];
            seen[(size_t) redundant[i]] = 1; // mark this character as seen
        }
    }

    unique[k] = '\0'; // terminate the new unique string properly

    printf("%s -> %s\n", redundant, unique);

    return 0;
}

我们使用一个标志数组(布尔值)来代替第二个内部循环来搜索是否已经复制了一个字母,其中字母是索引,以确定字母是否已被处理。

您可能想要考虑的另一件事是,是以不同方式处理大小写还是将其折叠成一个。