Вы можете сделать это в один проход с чем-то вроде:
#include <stdio.h>
#include <string.h>
int main (void) {
char str[] = "p123h12p97h62p32h"; // Input string.
int found[256]; // Assumes 8-bit char.
char *src, *dst; // Source and destination pointers.
// Output initial value and set found flags to false.
printf ("Before: [%s]\n", str);
memset (found, 0, sizeof(found));
// One loop, processing each source character in string.
for (src = dst = str; *src != '\0'; src++) {
// If not yet found, flag it found and transfer it, else do nothing.
if (!found[(unsigned int)(*src)]) {
found[(unsigned int)(*src)] = 1;
*dst++ = *src;
}
}
// Insert new end of string, then output it.
*dst = '\0';
printf (" After: [%s]\n", str);
return 0;
}
Это удаляет дубликаты в один проход, используя два указателя, что продвижение независимо через строку:
src
|
v
p123h12p97h62p32h
^
|
dst
Указатель src
продвигается вперед o каждая итерация цикла. Символ копируется из src
в dst
, а указатель dst
продвигается, только если символ ранее не был замечен (с использованием массива found
). Выход:
Before: [p123h12p97h62p32h]
After: [p123h976]
Обратите внимание на "assumes 8-bit char"
комментарий - это прекрасно, когда вы знаете, что набор символов ASCII (или любой другой 8-битный набор символов), но она не может быть переносимым на более экзотические реализации. Вам просто нужно убедиться, что в массиве found
достаточно элементов для всех ваших персонажей. Например, для 10-разрядного типа char
потребуется 1024 элемента (210 = 1024
).
-1 для неаккуратного отступа и так много пробелов, что рядом с кодом есть полоса прокрутки. Опубликуйте комментарий, когда вы правильно отформатировали код, и я передумаю. –
отправьте свой код на http://codereview.stackexchange.com/ – Constantinius