c - 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
解决方案
您将第一个候选人姓名的记忆用于整个姓名列表,从而更改他的姓名。显然这不是你想要的。您也可能溢出名称缓冲区。尝试这个:
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);
}
推荐阅读
- sql - 获取缺货但即将到来的产品的下一个可用日期
- javascript - 为什么这张地图上的标记不显示?
- python - Python:[Errno 2] 在 Mac 上的 VS Code 中没有这样的文件或目录
- node.js - Node/Express - PowerShell:Invoke-WebRequest:找不到接受参数“内容类型:应用程序/json”的位置参数
- wordpress - 丢失密码页面解码导致错误页面 Wordpress 的 url
- angular - Angular:表单验证无效,但输入无论如何都会更新
- python - 如何列出所有可能的排列?
- adobe - Adobe reader XI 不打开评论
- python - 如何根据元组的元素之间的关系对元组列表进行排序
- python - 自动设置 matplotlib 范围的 Y 限制