如何在C ++中使用字符串指针初始化数组

时间:2015-06-21 21:11:33

标签: c++ arrays algorithm pointers

任何人都可以在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)]++;
}

2 个答案:

答案 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'