- 此问题在此处已有答案**:
How do I properly compare strings in C?(10个答案)
2天前关闭。
在下面的代码中,argv中的字符串永远不会与用户输入的字符串匹配。
例如,如果我执行./plurality Alice Bob
行的代码,argc中的名称会正确地传输到candidates
数组,但是它们永远不会与程序后面接收到的字符串匹配。(为了可读性,程序中不必要的部分被删除了。)
#include <cs50.h>
#include <stdio.h>
#include <string.h>
// Max number of candidates
#define MAX 9
// Candidates have name and vote count
typedef struct
{
string name;
int votes;
}
candidate;
// Array of candidates
candidate candidates[MAX];
// Number of candidates
int candidate_count;
// Function prototypes
bool vote(string name);
void print_winner(void);
int main(int argc, string argv[])
{
for (int i = 0; i < candidate_count; i++)
{
candidates[i].name = argv[i + 1];
printf("%s ", candidates[i].name);
candidates[i].votes = 0;
}
printf("\n");
int voter_count = get_int("Number of voters: ");
// Loop over all voters
for (int i = 0; i < voter_count; i++)
{
string name = get_string("Vote: ");
// Check for invalid vote
if (!vote(name))
{
printf("Invalid vote.\n");
}
}
}
// Update vote totals given a new vote
bool vote(string name)
{
for (int i = 0; i < candidate_count; i++)
{
if (candidates[i].name == name)
{
candidates[i].votes++;
return true;
}
}
return false;
}
这快把我逼疯了,任何帮助都将不胜感激。
2条答案
按热度按时间0wi1tuuw1#
1.全局变量
int candidate_count
被隐式初始化为0,因此如果需要其他值,您可以为其赋值。考虑在循环条件中使用argc,无论如何,您需要安全地索引argv[i + 1]
。1.使用
!strcmp()
比较两个字符串是否相等。1.(建议)不要使用全局变量。
1.(未修复)请考虑在
vote()
中使用lfind()
。1.(想法)在1,000多张选票之前不会更快,但你也可以对候选数组(
qsort()
)排序,并使用二分搜索(bsearch()
)。或者,在添加候选时保持数组排序。这里的见解是,候选数可能比选票数少得多。1.(想法)考虑使用数组的结构体,而不是结构体的数组:
动态分配names和votes数组需要做更多的工作,但它更直接地Map到您的问题,包括您的搜索用例。
5kgi1eie2#
canidates[i].name == name
比较两个字符串的地址。请改用
strcmp()
。