sscanf没有按预期工作

时间:2016-12-03 06:25:24

标签: c printf scanf

所以我正在为我的班级编写一个程序,我从文本文件中读取了一行,如下所示:

while (fgets(line, sizeof(line), file) != NULL)

从文本文件获取并且我一直在使用匹配字符的行[index]来获取该文本文件中的特定行。

文本文件行如下所示;

dbr:Edmonton    rdf:type    yago:WikicatTownsInAlberta ,

我一直在使用sscanf从每一行获取特定数据。

sscanf(line,"%s %s %s %s",triple[t][0],triple[t][1],triple[t][2],triple[t][3]);

现在我期望得到的是:

triple[t][0] == dbr:Edmonton 
triple[t][1] == rdf:type 
triple[t][2] == yago:WikicatTownsInAlberta 
triple[t][3] == ,

而不是我的输出:

Object:dbr:rdf:yago, 
Predicate:rdf:yago, 
Subject:yago,
Extraneous: ,

然而,当我printf(%s,line)时,我得到的文件与文件中的完全一致。

这可能是完全愚蠢的,但我真的希望你能帮助我。

干杯,

整个代码如下:

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

sqlite3 * db;       // THE DATABASE
sqlite3_stmt * stmt;    // THE SQL STATEMENT

int main(int argc, char * argv[])
{
    // Do Argument Stuff, Open Database

int rc;
char * class;
char * data;

if (argc!=3)
{
    printf("Usage: <programfile.c database data>\n");
    printf("You specified %d arguments. You need to specify 3.\n",argc);
    return 1;
}
else
{
    printf("Correct Number of Inputs!\n");
    //printf("Argument %d: %s",argc,argv[0]);
    //printf("Argument %d: %s",argc,argv[1]);
    //printf("Argument %d: %s",argc,argv[2]);

    data = argv[2];
    printf("Data: %s\n",data);
    rc = sqlite3_open(argv[1], &db);
}

// Open File

FILE * file = fopen(data,"r");
if (file == NULL)
{
    printf("ERROR: File open error.\n");
    return 1;
}

/* Read the file */
char line[256];
char prefix[256][200];
char prefixURI[256][200];
char triple[256][200][4];
// object, predicate, subject

while (fgets(line, sizeof(line), file) != NULL)
{
    //printf("%s\n",line);
    int p = 0, t=0;
    // Handle COMMENTS and Blank Lines
    if (line[0] == '#' || line[0] == '\n')
    {
        continue;
    }
    // Handle "@prefix"
    else if (line[0] == '@')
    {
        // Load prefix (rdf: into prefix) and the URI into prefixURI.
        sscanf(line,"@prefix %s %s",prefix[p],prefixURI[p]);
        printf("Prefix Encoded: %s URI: %s\n",prefix[p],prefixURI[p]);
        p++;
    }
    // handle data triples
    else if (line[3] == ':')
    {
        printf("%s",line);
        sscanf(line,"%s %s %s %s",triple[t][0],triple[t][1],triple[t] [2],triple[t][3]);
        printf("Object:%s \nPredicate:%s \nSubject:%s\nExtraneous: %s\n",triple[t][0],triple[t][1],triple[t][2],triple[t][3]);
    }








} // end getWhile Loop


fclose(file);    

}

1 个答案:

答案 0 :(得分:-1)

如果str是一个包含多行的字符数组,则sscanf按列顺序读取字符。如果(line [3] ==':')condition

,你必须替换你

正确的方法是:

  // handle data triples
    else if (line[3] == ':')
    {
        printf("%s",line);
        sscanf(line,"%s %s %s %s",triple[0][t],triple[1][t],triple[2] [t],triple[3][t]);
        printf("Object:%s \nPredicate:%s \nSubject:%s\nExtraneous: %s\n",triple[0][t],triple[1][t],triple[2][t],triple[3][t]);
    }