0

I've tried running the program but when I put into an incorrect vote I get "segmentation fault". What's wrong?

EDIT: I've changed:

while (n < candidate_count)

to

while (n < candidate_count - 1)

As I figured I need to adapt the count to the fact that the array starts at 0. But now I get the error:

:( vote returns true when given name of last candidate
    vote function did not return true

My code:

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

    // 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 n = 0;
while (n < candidate_count)
  {
    if (strcmp(candidates[n].name, name) != 0)
    {
        n++;
        if ((n == candidate_count) && (strcmp(candidates[n].name, name) != 0))
        {
            return false;
        }
    } else
    {
        candidates[n].votes = candidates[n].votes + 1;
        return true;
    }
  }
    return false;
}

// Print the winner (or winners) of the election
void print_winner(void)
{
    // TODO
    return;
}
0

Fixed it. First needed to adapt the while statement the count was adjusted to that an array starts at 0, and then had to update the nested if statement so it also took consideration to this.

// Update vote totals given a new vote
bool vote(string name)
{
int n = 0;
while (n <= candidate_count - 1)
  {
    if (strcmp(candidates[n].name, name) != 0)
    {
        n++;
        if ((n == candidate_count - 1) && (strcmp(candidates[n].name, name) != 0))
        {
            return false;
        }
    } else
    {
        candidates[n].votes = candidates[n].votes + 1;
        return true;
    }
  }
    return false;
}

You must log in to answer this question.

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