2015-06-21 102 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