我什么时候应该使用地址为'&'的scanf &符号键?

时间:2014-09-04 23:17:06

标签: c arrays function struct

我必须在带有姓名和号码的文本文件中阅读。这些名字代表虚拟选举中的候选人(共7人),数字代表选民。如果选民号码不在7个候选人的范围内,它将被抛出但仍然存储。最后,我必须打印出谁赢得大选的结果以及有多少被破坏的选票。

这是我的文字档案:

Robert Bloom 
John Brown 
Michelle Dawn 
Michael Hall 
Sean O’Rielly 
Arthur Smith 
Carl White 

3 8 1 3 1 6 12 9 6 5 0 2 8 4 
6 6 8 3 2 8 0 12 6 1 8 3 2 2 
3 2 5 7 4 11 8 6 11 12 11 7 5 5 
8 9 10 12 1 3 12 12 9 11 7 9 3 1 
2 10 12 7 11 9 6 6 0 1 10 7 11 2 
8   0 12 8 10 11 2 2 8 4 2 12 3 2 
9   1 4 8 8 7 7 4 12 2 10 10 9 4 
12 9 3 12 0 4 8 0 6 5 9 0 5 3 
11  6   0   3   0 

这就是我如何正确扫描这些

的问题
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

FILE * data;
int spoilt=0;

typedef struct
{
 int votes;
 char name[20];
}candidates;

void initialize( candidates *electionCandidates, FILE *data )
{
    int i;
    for( i=0; i<7; i++ )
    {
        fscanf( data, "%[^\n]%*c", electionCandidates[i].name );
        printf( "%s\n", electionCandidates[i].name );
        electionCandidates[i].votes=0;
    }

}

int processVotes( candidates *electionCandidates, FILE *data )
{
    int i;                                           //tallying votes
    int voter;
    for ( i = 0; i< 365; i++ )
    {
       fscanf( data, "%d", voter );
       if ( voter <= 7&& voter > 0 )
        electionCandidates[voter-1].votes++;
       else
        spoilt++;
    }

                                                    //catcher to grab winner
    int maxValue, winner=0;

    maxValue = electionCandidates[0].votes;
    for( i = 0; i < 7; i++ )
    {
        if( maxValue < electionCandidates[i].votes )
        {
            maxValue = electionCandidates[i].votes;
            electionCandidates[winner] = electionCandidates[i];
        }

    }

    return electionCandidates[winner], maxValue;


}

void printResults( candidates *electionCandidates )
{
    printf("%s won the election with a total of %d votes.\n There was a total of %d spoilt"
            electionCandidates[winner].name, maxValue, spoilt);

}


int main() {
    data = fopen( "elections.txt","r" );
    candidates electionCandidates[7];

    initialize( electionCandidates, data );
    processVotes( electionCandidates, data );
    printResults( electionCandidates );


    fclose( data );
    return 0;
}

1 个答案:

答案 0 :(得分:1)

使用scanf时,您必须提供要将结果扫描到的变量的地址。使用&运算符提供地址。此外,最好检查scanf的结果,以确保它成功扫描了您要求的内容。除非发生I / O错误,否则scanf将始终返回成功扫描的元素数,在这种情况下,它将返回负数。

这是一个固定的,带注释的程序版本:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

typedef struct
{
 int votes;
 char name[20];
}candidates;

// specify a new type to hold the election result data
typedef struct
{
  int winner;
  int maxVotes;
  int spoilt;
} electionResult;

void initialize( candidates *electionCandidates, FILE *data )
{
    int i;
    for( i=0; i<7; i++ )
    {
        fscanf( data, "%[^\n]%*c", electionCandidates[i].name );
        printf( "%s\n", electionCandidates[i].name );
        electionCandidates[i].votes=0;
    }

}

// This function can now return more than one value, because we've wrapped
// the relevant info into a structure called "electionResult"
electionResult processVotes( candidates *electionCandidates, FILE *data )
{
    // declare the election result struct here (which we fill with data)
    // we initially set all values to 0

    electionResult er = {0, 0, 0};
    int i;                                           //tallying votes
    int voter;
    for ( i = 0; i< 365; i++ )
    {
       // scan the vote by providing the address of voter (using &)
       int result = fscanf( data, "%d", &voter );
       if (result == 1)
       {
          if ( voter <= 7&& voter > 0 )
             electionCandidates[voter-1].votes++;
          else
             er.spoilt++;
       }
    }

    er.maxVotes = electionCandidates[0].votes;
    for( i = 0; i < 7; i++ )
    {
        if( er.maxVotes < electionCandidates[i].votes )
        {
            // update the values in the election result struct
            er.maxVotes = electionCandidates[i].votes;
            er.winner = i;
        }
    }

    return er;
}

// this function now prints the result of the election by accepting an "electionResult" struct
void printResults( candidates *electionCandidates, electionResult er )
{
    printf("%s won the election with a total of %d votes.\n There was a total of %d spoilt",
            electionCandidates[er.winner].name, er.maxVotes, er.spoilt);

}


int main() {
    FILE *data = fopen( "elections.txt","r" );
    candidates electionCandidates[7];
    electionResult er;

    initialize( electionCandidates, data );
    er = processVotes( electionCandidates, data );
    printResults( electionCandidates, er );


    fclose( data );
    return 0;
}

一些提示:

  • 您无法访问其他功能中声明的变量。您必须从一个函数返回所需的数据并将其提供给另一个函数。

  • 如果可以,请避免在文件范围内声明变量。对于像这样的简单程序,它不是一个大问题,但一般来说,使用全局变量往往会变得很乱。

  • 您不能从函数中返回多个值,除非您将结构中的值包装起来,如上所述,或者让您的函数接受指针类似于fscanf接受&voter的方式,然后使用适当的数据填充voter变量(如果可以的话)。