在C中用fscanf读取多个字符串

时间:2010-12-09 19:47:46

标签: c scanf

我在这样的文件中有一行:“33 sun 15:00 FCM - SIF 3 - 0”。 我需要提取所有数据。到目前为止我有这个代码,在提取字符串“sun”,“FCM”和“SIF”时会出现一点错误。它将“sun”变为“sunFCMSIM”,将“FCM”变为“FCMSIF”,而“SIF”是正确的。

您可以像上面那样从多行创建输入文件。 那么如何确保提取这些信息是正确的呢?

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

#define LINEBUFFERSIZE 50
#define TEAMNAMELENGTH 3
#define WEEKDAYLENGTH 3

void __construct(char fileName[FILENAME_MAX]) {
FILE *inputFile;
char buffer[LINEBUFFERSIZE];
// Open input file
inputFile = fopen(fileName, "r");

// Read all matches and create
while(fgets(buffer, LINEBUFFERSIZE, inputFile) != NULL){
    int round, hour, minute, homeGoals, outGoals;
    char outTeam[TEAMNAMELENGTH], homeTeam[TEAMNAMELENGTH], weekday[WEEKDAYLENGTH];

    fscanf(inputFile, "%d %3s %2d:%2d %3s - %3s", &round, weekday, &hour, &minute, homeTeam, outTeam);
    printf("Round: %d\n", round);
    printf("%s %02d:%02d\n", weekday, hour, minute);
    //printf("%s - %s\n", homeTeam, outTeam);
}

fclose(inputFile);
}

int main() {
    /*char inputFile[FILENAME_MAX];
    printf("Enter input file> "); scanf("%s", &inputFile);*/
    __construct("superliga-2009-2010");
    return 0;
}

1 个答案:

答案 0 :(得分:1)

根据fscanf的文档,s转换说明符:

  

匹配一系列非空白字符;下一个指针必须是一个指向字符数组的指针,该指针足够长,可以保存输入序列和终止空字符('\ 0'),这是自动添加的。

您的缓冲区不够大,无法容纳NULL终止符。如果您解决了这个问题,例如声明outTeamhomeTeamweekday,如下所示:

char outTeam[TEAMNAMELENGTH + 1], homeTeam[TEAMNAMELENGTH + 1], weekday[WEEKDAYLENGTH + 1];

您的代码按预期工作。