任何人都可以在count [*(str + i)] ++的逻辑背后解释我。我知道,它正在初始化count数组。但是怎么样? even *(str + i)等于str [i],而不是指定count数组的索引值,n还如何将字符的出现次数保持为count? 谢谢你
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)]++;
}
答案 0 :(得分: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] = {};
。
答案 1 :(得分: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)]++;
否则可能会出现下标运算符的索引(方括号内的表达式)为负的情况。
因此,如果要正确重写此代码段
#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)]++;
}
然后它计算字符串“test string”中符号的出现次数。无符号字符的总数为256(请参阅#define NO_CHAR 256)。因此,动态分配的数组的每个元素都对应于某个字符。例如,字符'a'
具有内部ASCII代码96
。因此,索引为96
的数组元素将包含字符串中字符“a”的出现次数。这个元素可以像
count[96]
这相当于表达式*(str+i)
,前提是str + i
指向源字符串中的字符'a'
。