C语言 argv始终与输入不匹配[重复]

utugiqy6  于 2023-01-20  发布在  其他
关注(0)|答案(2)|浏览(117)
    • 此问题在此处已有答案**:

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

这快把我逼疯了,任何帮助都将不胜感激。

0wi1tuuw

0wi1tuuw1#

1.全局变量int candidate_count被隐式初始化为0,因此如果需要其他值,您可以为其赋值。考虑在循环条件中使用argc,无论如何,您需要安全地索引argv[i + 1]
1.使用!strcmp()比较两个字符串是否相等。
1.(建议)不要使用全局变量。
1.(未修复)请考虑在vote()中使用lfind()
1.(想法)在1,000多张选票之前不会更快,但你也可以对候选数组(qsort())排序,并使用二分搜索(bsearch())。或者,在添加候选时保持数组排序。这里的见解是,候选数可能比选票数少得多。
1.(想法)考虑使用数组的结构体,而不是结构体的数组:

struct candidates {
   string *names;
   int *votes;
}

动态分配names和votes数组需要做更多的工作,但它更直接地Map到您的问题,包括您的搜索用例。

#include <cs50.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>

#define MAX 9

typedef char * string;
typedef struct {
    string name;
    int votes;
} candidate;

bool vote(size_t len, candidate candidates[len], string name) {
    for (size_t i = 0; i < len; i++)
        if (!strcmp(candidates[i].name, name)) {
            candidates[i].votes++;
            return true;
        }
    return false;
}

int main(int argc, string argv[]) {
    size_t candidate_count = argc - 1;
    // if(candidate_count > MAX) {
    //  printf("too many candidates\n");
    //  return 1;
    // }
    candidate candidates[candidate_count];
    for (size_t 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: ");
    for (int i = 0; i < voter_count; i++) {
        string name = get_string("Vote: ");
        if (!vote(candidate_count, candidates, name)) {
            printf("Invalid vote.\n");
        }
    }
}
5kgi1eie

5kgi1eie2#

canidates[i].name == name比较两个字符串的地址。
请改用strcmp()

相关问题