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);
}
我目前正在学习 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);
}