В вашей строке:
strcmp(&cur, temp)
cur
- это char
, объявленный локально, и, следовательно, &cur
- это просто какое-то место в стеке, и в этом контексте довольно бессмысленное.
Полагаю, вы хотите проверить, совпадает ли текущий символ cur
со следующим символом *temp
.
Это будет выглядеть так:
if (cur == *temp) //if characters are same
count++;
Далее, я бы посмотрел на упрощенный вывод вашей секции:
sprintf(outputCat, "%c = %d", *cur, count); // e.g. "e = 8"
count=0;
И, наконец, я сомневаюсь, что ваш цикл когда-либо завершится, поскольку он продолжает выполнять temp++
, в то время как temp != NULL
.
Я полагаю, вы намереваетесь проверить ЗНАЧЕНИЕ, хранящееся в указателе temp
.
*temp
должен быть правильно проверен на '\ 0', а не на NULL.
(\ 0 и NULL имеют одно и то же значение, но они должны , а не обрабатываться одинаково семантически)
while (*temp != '\0'){
P.S. Ваш простой, но превосходный комментарий "// если символы одинаковы" был чрезвычайно полезен для меня, чтобы понять ваш код. Это отличный случай, когда короткие, значимые комментарии являются НЕЗНАЧИМЫМИ . Спасибо.
(надеюсь, окончательное редактирование)
В целом, изменения, которые я рекомендую, выглядят так:
void printArray(Node_ptr node){
int count=0; //character count
char *temp= node->attributes; //duplicate attribute array
char cur; //current char
char *outputCat= emalloc(150); //concatenate counts to a single string
strcpy(outputCat, "Attribute %d counts are: ");
qsort(temp, lineCount, sizeof(char), compare); //sort the array
while (*temp != '\0'){
cur= *temp;
++temp;
if (cur == *temp) //if characters are same
count++;
else { //build reporting string
sprintf(outputCat, "%c = %d", *cur, count); // e.g. "e = 8"
count=0;
}
}
free(outputCat);
}
Как это работает для вас?