strcat 不适用于 for 循环中的第二项

strcat does not work for second item in for loop only

我目前正在学习 HarvardX 的 CS50 课程。我目前面临的练习的目标是在选举中输出所有获胜者。因为之后我不需要输出,所以我认为将它们全部添加到一个字符串中,中间有一个换行符就可以了。它确实成功了,但仅适用于选举获胜者 1 和 3、4、5 等。出于某种原因,它不适用于 for 循环中的第二次迭代,我不知道为什么。

这是打印获胜者的函数:

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 语句。它确实有效,并且对于每次迭代,它都会正确打印出候选人的姓名,但第二个除外。当我在 if-else 语句的底部打印 most_votes 时,我得到:

两位候选人

a

三个候选人

a

c

四位候选人

a

c
d

我不知道为什么 b 会消失,因为打印 candidates[b].name 确实会给出 b。我可能忽略了一些非常简单的东西,但我不知道是什么。

提前致谢。

编辑: 我以为我犯了一个简单的错误,但似乎不一定如此。 我现在知道问题出在这一行:

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

删除它可以解决问题,但由于我确实需要换行符,所以这并不能解决我的问题。替换其他字符串的换行符不会改变结果,所以可能连续两次对同一个变量使用 strcat 是有问题的?我不知道。

如果有人想尝试,可以在这里找到完整的代码: Github

您将第一个候选人名字的记忆用于整个名单,从而更改了他的名字。 显然这不是你想要的。您也可能溢出名称缓冲区。试试这个:

void print_winner(void)
{
    char most_votes[1000];
    int highest_vote = -1; /* force a new high score with the first candidate*/
    most_votes[0] = '[=10=]'; /*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);
}