strcat не работает для второго элемента только для l oop - PullRequest
0 голосов
/ 18 апреля 2020

В настоящее время я прохожу курс HarvardX CS50. Цель упражнения, с которым я сейчас сталкиваюсь, - вывести всех победителей на выборах, когда они связаны. Поскольку впоследствии мне не нужен вывод, я подумал, что сложить их все в строку с разрывом строки между ними получится. Это сработало, но только для победителей выборов 1 и 3, 4, 5 et c. По той или иной причине он не работает для второй итерации в for l oop, и я понятия не имею, почему.

Это функция для печати победителя:

void print_winner(void)
{
    string most_votes;
    int highest_vote = 0;

    for(int i = 0; i < candidate_count; i++)
    {

            if(candidates[i].votes > highest_vote)
            {
                most_votes = candidates[i].name;
                highest_vote = candidates[i].votes;
            }
            else if(candidates[i].votes == highest_vote)
            {
                printf("Name %i: %s\n", i, candidates[i].name);
                most_votes = strcat(most_votes, "\n");
                most_votes = strcat(most_votes, candidates[i].name);
                printf("%s\n", most_votes);
            }
    }

    printf("%s\n", most_votes);

    return;

Интересным моментом является утверждение else-if. Он работает и для каждой итерации правильно выводит имя кандидата, за исключением второй. Когда я печатаю most_votes внизу оператора if-else, я получаю:

для двух кандидатов

a

для трех кандидатов

a

c

Для четырех кандидатов

a

c
d

Я понятия не имею, почему b отпадает, так как распечатка кандидатов [b] .name дает b. Я, вероятно, упускаю из виду что-то очень простое, но я понятия не имею, что.

Заранее спасибо.

РЕДАКТИРОВАТЬ: Я ожидал, что я сделал простую ошибку, но, похоже, это не обязательно дело. Теперь я знаю, что проблема в этой строке:

most_votes = strcat(most_votes, "\n");

Удаление ее решает проблему, но, поскольку мне действительно нужен разрыв строки, это не решает проблему для меня. Замена разрыва строки для других строк не меняет результат, поэтому, может быть, использование strcat для одной и той же переменной дважды подряд проблематично c? Я не знаю.

Если кто-то захочет попробовать, весь код можно найти здесь: Github

1 Ответ

1 голос
/ 18 апреля 2020

Вы используете память имени первого кандидата для всего списка имен и таким образом изменяете его имя. Очевидно, это не то, что вы хотите. Также возможно, что вы переполните буфер имен. Попробуйте это:

void print_winner(void)
{
    char most_votes[1000];
    int highest_vote = -1; /* force a new high score with the first candidate*/
    most_votes[0] = '\0'; /*valid string in case of no votes at all*/

    for(int i = 0; i < candidate_count; i++)
    {
        if(candidates[i].votes > highest_vote) /*new high score*/
        {
           strcpy(most_votes, candidates[i].name);
           highest_vote = candidates[i].votes;
        }
        else if(candidates[i].votes == highest_vote)
        {
           printf("Name %i: %s\n", i, candidates[i].name);
           strcat(most_votes, "\n");
           strcat(most_votes, candidates[i].name);
           printf("%s\n", most_votes);
        }
    }
    printf("The winner(s) with %i votes:\n%s\n", highest_vote, most_votes);
}
...