C使用strtok解析输入文件

标签 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,这样我就可以处理解析矩阵。

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

谢谢

最佳答案

首先将行分成一个标记数组。然后,根据第一个标记,您可以使用 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, "") 从行中提取下一个标记,并返回指向该标记的指针 token (如果没有更多 token ,则返回 NULL)。返回值存储在 token[i] 中。如果返回值为 NULL,则循环中断。

关于C使用strtok解析输入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32959253/

相关文章:

.net - 在 .NET 中将复杂的 boolean 条件从字符串转换为 boolean 值

javascript - 在 Google Apps 脚本中解析 JSON 时出现未定义错误

java - SD卡中的二维数组太慢

c - 多线程程序中的意外输出

c - FloodFill 函数调用不起作用

c - 将输入读入数组会导致分段违规

c# - 校验功能。将 C 转换为 C#

c# - 如何从 C# 中的相对 URL 字符串获取参数?

c - 如何使用递归构建螺旋方阵?

java - 矩阵交换行 - Java