2013-11-27 5 views
1

Нужно вычислить код, который учитывает все повторяющиеся символы в строке. Как вы можете видеть ниже, пока все хорошо.C, Отображение количества повторяющихся символов

И вот начинается сложная часть, в конце кода я хочу выводить символы в порядке их ввода, который имел, например, 2 вхождения в строку, и у меня возникли проблемы с этим.

int counts[256] = { 0 }; 

int i; 
size = strlen(text); 

for (i = 0; i < size; i++) { 
counts[(int)(text[i])]++; 
} 

for (i = 0; i < 256; i++) { 
printf("The %d. character has %d occurrences.\n", i, counts[i]); 
} 
+1

Можете ли вы объяснить, что делать и хотят? –

+0

Вам нужно будет отсортировать его. –

+1

Это опасно, если 'char'' подписан 'и у вас есть значения символов больше 127. @BitFiddlingCodeMonkey Нет, вам не нужно его сортировать. См. Текущий ответ. – paddy

ответ

1
for(i = 0; i < size; i++) { 
    if(counts[(int)(text[i])] == 2) 
     printf("%d", (int)(text[i])); 

Первая строка проходит через вашу исходную строку для порядка вхождений. Вторая строка проверяет, была ли она захвачена в массиве counts как только два раза. Если это так, мы печатаем код символа на третьей строке.

Для печати только символ раз:

for(i = 0; i < size; i++) { 
    if(counts[(int)(text[i])] == 2) { 
     printf("%d", (int)(text[i])); 
     counts[(int)(text[i])] = 0; 
    } 
} 
+0

Не должно быть '> =' вместо '=='? –

+1

Это зависит от того, хотите ли вы проверить, произошел ли этот символ только дважды ('=='), или если это произошло не менее двух раз ('> ='). Я собираюсь изменить свой ответ, чтобы указать это, спасибо! –

+0

Спасибо за помощь! Но код показывает повторяющийся символ дважды, в то время как мне нужно, чтобы он появлялся только один раз. например, если я вводил строку «ABCA», она должна выдавать «A» вместо «AA» любые идеи? – user3043290

2

Просто перебирать строку источника снова и для каждого символа заглянуть в ваш counts массив.

Если вы не хотите печатать одну и ту же статистику для каждого повторяющегося символа, вы можете сбросить соответствующее значение counts до нуля сразу после печати статистики и выполнить дополнительную проверку перед печатью.

+0

Скорее всего, вы должны скопировать буфер, прежде чем изменять его, если он вам понадобится. –

1

Здесь реализация Вдохновленный «s ответ:

int counts[256] = { 0 }; 

char text[] = "Hello, world!"; 

int i, size = strlen(text); 

for (i = 0; i < size; i++) 
{ 
    counts[(unsigned int)(text[i])]++; 
} 

for (i = 0; i < size; i++) 
{ 
    if (counts[(unsigned int)text[i]] > 1) 
    { 
     printf("%c", text[i]); 
     counts[(unsigned int)text[i]] = 0; // Remove to print repeats. 
    } 
} 
+0

Это не печатает его в том порядке, в котором оно было напечатано ... –

+0

@BitFiddlingCodeMonkey, howcome? – Raptor

+1

Должно быть '> 0' или'> = 1'. Не '> 1'. Будет ли кто-то * просить * cast '(unsigned char) текст [i]' перед индексированием !! – paddy

0

Сделать ключ, считай пара, как:

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

int main() 
{ 
    char* text = "count this text"; 
    char *keys = new char[strlen(text)]; 
    int* count = new int[strlen(text)]; 
    int last = 0; int j=0; 

    for(int i=0; i<strlen(text); i++){ 
     for(j=0; j<last; j++){ 
     if(keys[j]==text[i]) break; 
     } 
     if(keys[j]==text[i]){ 
     count[j]++; 
     } else { 
     keys[last]=text[i]; 
     count[last]=1; 
     last++; 
     } 
    } 

    for(int i=0; i<last; i++){ 

     printf("%c %d\n", keys[i], count[i]); 
    } 
} 

, чтобы сохранить порядок в тексте и получить счет.

Об исполнении выход:

c 1 
o 1 
u 1 
n 1 
t 4 
2 
h 1 
i 1 
s 1 
e 1 
x 1 
+1

Ugh. Это даже не C, ваши массивы не инициализируются, и алгоритм отвратителен. – paddy

+0

Хорошо, это не C, но легко преобразуется, массивы не нуждаются в инициализации, это потеря времени, а алгоритмы дают то, что Op хотел без особых проблем –

Смежные вопросы