c - 如何在循环中使用 sscanf?

标签 c string scanf

有没有一种使用sscanf循环遍历字符串的好方法?

假设我有一个如下所示的字符串:

char line[] = "100 185 400 11 1000";

我想打印总和。我真正想写的是:

int n, sum = 0;
while (1 == sscanf(line, " %d", &n)) {
  sum += n;
  line += <number of bytes consumed by sscanf>
}

但是没有干净的方法可以从 sscanf 中获取该信息。如果它返回消耗的字节数,那将很有用。在这种情况下,可以只使用 strtok,但如果能够编写类似于您可以从 stdin 执行的操作,那就太好了:

int n, sum = 0;
while (1 == scanf(" %d", &n)) {
  sum += n;
  // stdin is transparently advanced by scanf call
}

有没有我忘记的简单解决方案?

最佳答案

查找 sscanf()%n 转换说明符和家人。它为您提供所需的信息。

#include <stdio.h>

int main(void)
{
    char line[] = "100 185 400 11 1000";
    char *data = line;
    int offset;
    int n;
    int sum = 0;

    while (sscanf(data, " %d%n", &n, &offset) == 1)
    {
        sum += n;
        data += offset;
        printf("read: %5d; sum = %5d; offset = %5d\n", n, sum, offset);
    }

    printf("sum = %d\n", sum);
    return 0;
}

将“行”更改为“数据”,因为您不能递增数组的名称。

关于c - 如何在循环中使用 sscanf?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3975236/

相关文章:

c - 从文件中读取带空格的固定大小寄存器

C:如何在矩阵中使用 scanf 读取多个值

自定义递归函数 |根本不返回任何值|在 C

c - 将 `HWND` 与 `INVALID_HANDLE_VALUE` 进行比较是错误的吗?

string - Haskell 中的内存高效字符串

java - 用于 java 的 Linux 字符串命令

c - 如何在C中输入char*?

c - 在 Linux(或 POSIX)中以只读方式重新打开文件

c - 海湾合作委员会 fprintf : should that be an int (32bit) or char (8bit)?

ios - 将千位分隔符 "˙"添加到 float