我有一个包含特定格式数据的文件,我想从该文件中提取并存储某些数字。在程序中,我最初使用 sscanf 来解析和存储文件中的值,并且效果很好。但是,我被告知根本不允许使用 sscanf、fscanf 或任何其他库函数。我唯一可以使用的两个函数是 scanf 和 fgets 来实现此目的,然后我应该自己手动将字符串值转换为整数(这不是问题)。我很沮丧,因为似乎 scanf 根本不是为了在不使用其他库函数的情况下以这种方式使用而设计的,是否有我遗漏的东西?如果您能向我展示如何实现这一目标,我将不胜感激。
这是我需要帮助的代码部分(假设文件已打开并正在读取,并且缓冲区中存储了一行):
char str1[5], str2[5];
if (scanf(buffer, "test1 %s, test2%s", str1, str2) == 2) {
printf("Success");
}
我认为 scanf 正在等待键盘输入,并且不读取缓冲区中的行。
这是我文件中的行,程序应该跳过 test1 和 test2 并选取它们前面的数字(4 和 5)并将它们存储在 str1 和 str2 中:
测试1 4,测试25
使用
fgets()
将文件中的一行作为 string 读入缓冲区。解析字符串。
编写自己的
sscanf()
并具有有限的匹配功能并不是太多代码。
下面是未经测试的示例代码,用于启动 OP。
#define BUF_N 5
int my_scanf2(const char *buffer, const char *fmt, char *str1, char *str2) {
if (buffer == 0 || fmt == 0 || str == 0 || str2 == 0) {
return EOF;
}
char *s[] = { str1, str2 };
int count = 0;
while (*fmt) {
if (*fmt == '%') {
fmt++;
if (*fmt != 's' || count == 2) {
return EOF;
}
unsigned len = 0;
while (my_iswhitespace(*buffer)) {
buffer++;
}
while (len < BUF_N-1 && *buffer && !my_iswhitespace(*buffer)) {
s[count][len++] = *buffer++;
}
if (len == 0) {
return count;
}
s[count][len] = '\0';
count++;
} else if (*fmt == *buffer) {
buffer++;
} else {
return count;
}
fmt++;
}
if (*fmt) {
return count;
}
// Usage
if (my_scanf2(buffer, "test1 %s, test2%s", str1str1, str2) == 2) {
printf("Success");
}