C使用strtok解析输入文件

时间:2015-10-05 23:05:16

标签: c parsing matrix

目前正在尝试解析C中的输入文件以提取变量。

输入文件如下:

% this is a comment
x 3
% another comment
y 5.0
% one last comment
z 4

x,y和z是我的C类中的预定义变量。我的目标是解析这个文件,使得int x的值为3,y的值为5.0,z的值为4.任何以%开头的行最终都会被忽略

我已经设法使用fgets和sscanf来做到这一点 - 这是尝试:

while (!feof(inputFile)) {
    fgets(ch,500,inputFile);
    if (sscanf(ch, "x %d", &x)) {
        printf("x: %d\n", x);
    } else if (sscanf(ch, "y %lf", &y)) {
        printf("y: %lf\n", y);
    } else if (sscanf(ch, "z %d", &z)) {
        printf("z: %d\n", z);
    }

并打印出所需的结果。但是现在我尝试使用fgets和strtok,因为我不认为我可以使用上面的代码来处理矩阵(即如果我在输入文件中(注意,在这种情况下,a也将是在我的c文件中预定义):

a
1 -1 3
2 1 6
9 3 0

我想将这些值存储在一个3x3矩阵中,我认为使用sscanf是不可能的(特别是如果矩阵的尺寸是可变的 - 但它总是一个n * n矩阵)。我尝试使用fgets和strtok是:

while (!feof(inputFile)) {
    fgets(ch,500,inputFile);
    token = strtok(ch, " ");
    while (token) {
        if (strcmp(token, "x")) {
            printf("%s", "x found");
            // Here is my problem - how do I look at the next token where the value for x is stored

        }
        token = strtok(NULL, " ");
        break;
}
    break;
}

我的代码中的问题在评论中说明。我已经考虑了一段时间,尝试了各种各样的事情。我认为困难来自于理解strtok如何工作 - 最初我试图将每个令牌存储到数组中。

在帮助我弄清楚如何复制现有代码以使用strtok而不是sscanf时,我们非常感谢任何帮助,以便我可以解析矩阵。

我知道那里有一些解析问题,但我没有看到任何解决如何解析矩阵的问题。

由于

1 个答案:

答案 0 :(得分:0)

首先将该行分成一个令牌数组。然后,根据第一个令牌,您可以使用strtolstrtod来转换剩余的令牌。以下代码演示了如何将输入行分解为标记数组

char line[500];
char *token[200];
int tokenCount = 0;
while ( fgets( line, sizeof line, fp ) != NULL )
{
    token[0] = strtok( line, " " );
    if ( strcmp( token[0], "%" ) == 0 )   // skip comments
        continue;

    // break the line into tokens
    int i;
    for ( i = 1; i < 200; i++ )
        if ( (token[i] = strtok( NULL, " " )) == NULL )
            break;
    tokenCount = i;

    // output the token array
    for ( i = 1; i < tokenCount; i++ )
        printf( "%s: %s\n", token[0], token[i] );
}

for循环生成一个从1到200的数组索引。strtok( NULL, " " )从行中提取下一个标记,并返回指向该标记的指针(如果有,则返回NULL没有更多的代币)。返回的值存储在token[i]中。如果返回值为NULL,则循环中断。