我有一个包含特定格式数据的文件,我想从该文件中提取并存储某些数字.在程序中,我最初使用sscanf来解析和存储文件中的值,它工作得很好.然而,要做到这一点,然后我应该自己手动将字符串值转换为整数(这不是问题).我很沮丧,因为似乎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读入缓冲区.然后解析该字符串.

编写您自己的具有limited matching功能的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");
}

C++相关问答推荐

如何确保内存分配在地址附近?

ATTiny1606定时器TCA 0中断未触发

是否可以使用指针算法在不对齐的情况下在 struct 中相同类型的字段的连续序列之间移动?

进程在写入管道时挂起

为什么此共享库没有预期的依赖项?

Square不与Raylib一起移动

tick.q中的Kdb+键控表语法

在for循环中指向数组开头之前

理解bzip2的BZ2_解压缩函数中的状态重新分配

Zlib:解压缩大文件导致";无效代码长度设置";错误

C语言中奇怪的输出打印数组

使用正则表达式获取字符串中标记的开始和结束

不带Malloc的链表

正在try 理解C++中的`正在释放的指针未被分配‘错误

通过char*访问指针的对象表示是未定义的行为吗?

未为同一文件中的函数执行DirectFunctionCall

将不同类型的指针传递给函数(C)

C中2个数字的加法 - 简单的人类方法

中位数和众数不正确

是否可以在多字 C 类型中的任何位置混合存储和类型限定符?