目前正在尝试用 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,这样我就可以处理解析矩阵。
我知道那里有一些解析问题,但我没有看到任何解决如何解析矩阵的问题。
谢谢
最佳答案
首先将行分成一个标记数组。然后,根据第一个标记,您可以使用 strtol
到 strtod
来转换剩余的标记。下面的代码演示了如何将输入行分解为一个标记数组
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/