首页 文章

是否有一个版本的sscanf()不是从第一个字节开始的?

提问于
浏览
0

在C中, fscanf() 不一定从第一个字节读取文件;它从当前访问位置读取文件 . 我需要一个 sscanf() 的版本,它对字符串做同样的事情 . 是否有任何功能(标准或非标准)用于此目的?

更新:似乎我没有知道这种 sscanf() 应该开始读取的地方/偏移的数值;我希望它从之前的调用完成之处读取 . 谢谢 .

4 回答

  • 7

    在简单的情况下,您可以使用 "%n" 说明符,就像这样

    int x, y, length;
    if (sscanf(string, "%d%d%n", &x, &y, &length) == 2) ...
    

    现在 length 将在字符串中具有“位置”,以便下次可以从那里继续

    if (sscanf(string + length, "%d%d%n", &x, &y, &length) == 2) ...
    

    在更复杂的情况下,您可能需要的不仅仅是 sscanf() ,或者取决于您所使用的平台fmemopen(3),因此您可以使用 fscanf() ,同时拥有您希望的字符串并与之交互,就好像它是一个文件一样 .

  • 0

    C字符串没有当前访问位置的概念,除非您在外部提供 . 因此, sscanf() 的任何变体都不能考虑固有的当前访问位置 . 原则上,可能有一个变量接受起始位置作为附加参数,但这将是多余的,因为正如@MichaelWalz所观察到的,您可以使用常规指针算法来实现 sscanf() 本身 .

  • 0

    为此目的是否有任何功能(标准或非标准)?

    不,没有't. You' ll必须跟踪从字符串中偏移多少并在调用 sscanf 时使用它 .

    sscanf(string + offset, ...);
    

    要跟踪偏移量,可以使用 %n 格式说明符让 sscanf 告诉您消耗的字符数 .

    int offset = 0;
    int n = 0;
    sscanf(string + offset, "....%n", ... &n);
    offset += n;
    
    ...
    
    sscanf(string + offset, "....%n", ... &n);
    offset += n;
    
  • 0

    使用 "%n 是处理扫描前一部分扫描完成的字符串的常用方法,因为 "%n" 记录扫描到该点的偏移量 .

    将其附加到格式的末尾并测试索引值是否从-1更改 . 这适用于简单和复杂的格式 .

    int scanf_buffer_2_step(const char * buffer) {
      int i;
      double d;
    
      // Initialize to a value that a successful scan would never use.
      int n = -1;
    
      // append                vv       vv
      sscanf(buffer, "Index:%d,%n", &i, &n);
    
      // Test for success
      if (n < 0) return 1; // fail
    
      // Advance pointer to next string position
      buffer += n; 
    
      // Do it some more    
      n = -1;
      sscanf(buffer, " Data:%lf End of the line %n", &d, &n);
      if (n < 0) return 1; // fail
      buffer += n; // Advance pointer to next string position
    
      if (buffer[0] != '\0') return 1; // fail (extra data)
    
      printf("(%i %f)", i, d);
      return 0;
    }
    
    int main(void) {
      printf("%d\n", scanf_buffer_2_step("Index:1, Data:123.456 End of the line"));
      printf("%d\n", scanf_buffer_2_step("Index:1, Data:123.456 End of the line extra"));
      printf("%d\n", scanf_buffer_2_step("Index:1,"));
      return 0;
    }
    

    产量

    (1 123.456000)0
    1
    1
    

    对于最终扫描,如果在字符串末尾允许使用 '\n' ,则考虑添加 " %n" .

    对于 fscanf() ,还会出现问题,例如检查 EOF 的返回值 .

相关问题