0

I don't understand why my code only considers the first command line argument and shows "Invalid Input" for rest of the arguments upon passing other argument's name while voting. Here is the code snippet:

#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[])
{

    // Check for invalid usage
    if (argc < 2)
    {
        printf("Usage: plurality [candidate ...]\n");
        return 1;
    }

    // Check for single candidate
    if (argc == 2)
    {
        printf("%s\n", argv[1]);
        return 1;
    }

    // Populate array of candidates
    candidate_count = argc - 1;

    if (candidate_count > MAX)
    {
        printf("Maximum number of candidates is %i\n", MAX);
        return 2;
    }

    for (int i = 0; i < candidate_count; i++)
    {
        candidates[i].name = argv[i + 1];
        candidates[i].votes = 0;
    }

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

    // Display winner of election
    print_winner();
}

// Update vote totals given a new vote
bool vote(string name)
{
    int i;

    for(i=0; i<candidate_count; i++)
    {
        if(strcmp(candidates[i].name,name) == 0)
        {
            candidates[i].votes++;
            return true;
        }

        else
        return false;
    }
    return false;
}

// Print the winner (or winners) of the election
void print_winner(void)
{
    int win=0,i;

    for(i=0; i<candidate_count; i++)
    {
        if(candidates[i].votes > win)
        win = candidates[i].votes;
    }

    for(i=0; i<candidate_count; i++)
    {
        if(candidates[i].votes == win)
        {
            printf("%s\n",candidates[i].name);
        }
    }
    return;
}
1

Consider the for loop in your vote() function: It compares the candidate name with the name introduced by the voter. In the very first pass (i = 0) what happens when the candidate name and the name introduced are not the same?

1
  • Error sorted, my bad. Thanks buddy! – Ishan Apr 20 '20 at 6:56

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .