Программа для удаления общих алфавитов из массива символов

#c

#c

Вопрос:

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

Здесь я попытался скопировать уникальные алфавиты из массива в другой массив .. означает, что дублированный алфавит не должен копироваться в другой array..it показывает правильный вывод, но вместе с этим он показывает некоторые мусорные значения, такие как смайлик или что-то в этом роде, до длины исходного входного массива (т.е. key [])

Комментарии:

1. Вам нужно поставить символ-терминатор '' в конце вашей выходной строки.

2. Пожалуйста, сначала правильно отформатируйте вашу программу.

Ответ №1:

Вам необходимо добавить ограничитель к уникальной символьной строке как во время ее инициализации, так и при каждом добавлении новой буквы:

 #include <stdio.h>

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

    gets(redundant);

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

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

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

        i  ;
    }

    printf("%s -> %sn", 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] = ''; // toss trailing newline due to fgets()

    int k = 0; // unique character counter

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

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

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

    return 0;
}
  

Вместо второго внутреннего цикла для поиска, была ли буква уже скопирована, мы используем массив флагов (boolean), где буква является индексом, чтобы определить, была ли буква обработана.

Еще одна вещь, о которой вы, возможно, захотите подумать, — это то, следует ли по-разному относиться к верхнему и нижнему регистру или объединить их в один.