2013-11-27 65 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'是'signed'並且你的字符值大於127,這很危險。@BitFiddlingCodeMonkey不,你不需要對它進行排序。看到當前的答案。 – paddy

回答

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

第一行通過源字符串循環出現次序。 第二行檢查它是否在counts數組中捕獲爲僅發生兩次。 如果是這樣,我們在第三行打印char代碼。

僅打印字符一次:

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

這裏是實現的啓發的回答是:

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,怎麼樣? – Raptor

+1

應該是'> 0'或'> = 1'。不''1'。請有人*請*在索引之前施放'(無符號字符)文本[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

呃。這甚至不是C,你的數組沒有被初始化,並且算法是可怕的。 – paddy

+0

好吧,這不是C但很容易轉換,數組不需要被初始化,這是一個時間的損失,算法給出了操作所需要的東西,沒有太多的大驚小怪 –