Распечатка значений с помощью указателей - PullRequest
0 голосов
/ 12 сентября 2011

У меня есть отсортированный массив с неопределенным количеством переменных и их количеством.Мне нужно построить строку примерно так:

Attribute[0]: p=2, e=8

Моя проблема в том, что массив на самом деле является указателем, и я не хочу использовать цикл фиксированной длины, поэтому единственное решение, которое я вижу, этоиспользуйте указатель массива.

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) != NULL){
        cur= *temp;
        ++temp;
        if (strcmp(&cur, temp)==0) //if characters are same
            count++; 
        else { //build reporting string
            strcat(outputCat, &cur);
            strcat(outputCat, "= ");
            sprintf(outputCat, "%d  ", count);
            count=0;
        }
    }
    free(outputCat);
}

Проблема в том, что strcmp(&cur, ++temp)==0 возвращает false каждый раз, даже когда я вижу их значения в отладчике.Из-за этого постоянно создается условие else, которое выдает ошибку после нескольких итераций.

Два вопроса:

1- Что может заставить strcmp возвращать ненулевое значение, даже если введены одинаковые значения?2- Что я могу сделать, чтобы исправить код?

1 Ответ

2 голосов
/ 12 сентября 2011

В вашей строке:

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);
}

Как это работает для вас?

...