首页 > 解决方案 > strcat 仅对 for 循环中的第二项不起作用

问题描述

我目前正在学习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 会消失,因为打印出 Candidate[b].name 确实给了 b。我可能忽略了一些非常简单的事情,但我不知道是什么。

提前致谢。

编辑:我预计我犯了一个简单的错误,但似乎情况并非如此。我现在知道问题出在这一行:

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

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

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

标签: ccs50

解决方案


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

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

推荐阅读