2015-06-21 106 views
-4

任何人都可以在count [*(str + i)] ++的邏輯後面解釋我。我知道,它正在初始化count數組。但是怎麼樣?即使*(str + i)等於str [i],它也不會如何指定count數組的索引值,也不管它如何保持字符出現次數爲count? 三江源如何在C++中使用字符串指針初始化數組

int *count=(int*)calloc(NO_CHAR,sizeof(int)); 
char str="test string"; 
#define NO_CHAR 256 
fillChar(str,count); 
void fillChar(char *str, int *count){ 
    int i; 
    for(i=0;*(str+i);i++) 
     count[*(str+i)]++; 
} 
+3

「我知道」後面有一些完整的誤解...... –

+0

你不應該傳遞一個指針來指定大小'void fillChar(char * str,int count){'。 –

+0

但爲什麼,??,我沒有得到任何問題 – sa8

回答

0

*(str + i)相同str[i]。該代碼創建字符串中字母的直方圖:

int * count = calloc(NO_CHAR, sizeof(int)); // array of all zero 

for (i = 0; str[i] != '\0'; ++i) // traverse until null terminator 
    ++count[str[i]];    // increment occurrence count 

最後,例如, count['a']是字符'a'的出現次數。

不要忘了free(count);最後。但實際上,這裏不需要動態分配,您可以使用int count[NO_CHAR] = {};

+0

謝謝,你真的給我一個清晰的方法,但它是如何計算出現的數量? – sa8

+0

@ sa8:每個字符都有一個數組元素:'count ['a']','count ['b']'等 –

+0

謝謝,我知道了 – sa8

0

首先,我認爲清單常數NO_CHAR必須在第一個語句之前定義。也就是說,不是

int *count=(int*)calloc(NO_CHAR,sizeof(int)); 
char str="test string"; 
#define NO_CHAR 256 
//... 

必須有

#define NO_CHAR 256 
int *count=(int*)calloc(NO_CHAR,sizeof(int)); 
char str="test string"; 
//... 

,因爲這種不斷在釋放calloc調用中使用。

至於程序,那麼它有未定義的行爲。根據編譯器選項,類型char可以表現爲類型signed char或類型unsigned char

因此這將是正確地寫

 count[(unsigned char)*(str+i)]++; 

代替

 count[*(str+i)]++; 

否則,可能會發生這樣一種方式,下標操作的索引(平方brakets內表達)將是負。

所以如果重寫此代碼段正確

#define NO_CHAR 256 

int *count = (int*)calloc(NO_CHAR, sizeof(int)); 

char str = "test string"; 
fillChar(str,count); 

//... 

void fillChar(char *str, int *count){ 
    int i; 
    for (i = 0; *(str+i); i++) 
     count[(unsigned char)*(str+i)]++; 
} 

然後計算符號的出現次數字符串「測試字符串」。無符號字符的總數是256(請參閱#define NO_CHAR 256)。所以動態分配數組的每個元素都對應於某個字符。例如,字符'a'具有內部ASCII碼96。因此索引爲96的數組元素將包含字符串中字符'a'的出現次數。此元件可以像

count[96] 

來解決這等同於表達*(str+i)提供str + i指向源串中字符'a'

+0

謝謝....對於有價值的描述。 .. 我知道了 – sa8