#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), где буква является индексом, чтобы определить, была ли буква обработана.
Еще одна вещь, о которой вы, возможно, захотите подумать, — это то, следует ли по-разному относиться к верхнему и нижнему регистру или объединить их в один.