C++ 使用'sscanf'与'istringstream'相同吗?

C++ 使用'sscanf'与'istringstream'相同吗?,c++,scanf,istringstream,C++,Scanf,Istringstream,使用istringstream,我们可以从字符串中逐个读取项目,例如: istringstream iss("1 2 3 4"); int tmp; while (iss >> tmp) { printf("%d \n", tmp); // output: 1 2 3 4 } 如果您可以使用 否则,scanf支持%n转换,这将允许您计算到目前为止所消耗的字符数(我还没有对此进行测试,可能还没有考虑到一些陷阱) charstr[]=“1234”; int ofs=0; 而(

使用
istringstream
,我们可以从字符串中逐个读取项目,例如:

istringstream iss("1 2 3 4");
int tmp;
while (iss >> tmp) {
    printf("%d \n", tmp);  // output: 1 2 3 4
}

如果您可以使用

否则,scanf支持%n转换,这将允许您计算到目前为止所消耗的字符数(我还没有对此进行测试,可能还没有考虑到一些陷阱)

charstr[]=“1234”;
int ofs=0;
而(ofs
如果您可以使用

否则,scanf支持%n转换,这将允许您计算到目前为止所消耗的字符数(我还没有对此进行测试,可能还没有考虑到一些陷阱)

charstr[]=“1234”;
int ofs=0;
而(ofs
您可以使用此

const char *s = "1 2 3 4";
int tmp, cnt;

for (const char *p = s; sscanf(p, "%d%n", &tmp, &cnt) == 1; p += cnt)
  printf("%d\n", tmp);

你可以用这个来模拟它

const char *s = "1 2 3 4";
int tmp, cnt;

for (const char *p = s; sscanf(p, "%d%n", &tmp, &cnt) == 1; p += cnt)
  printf("%d\n", tmp);

我不确定
%n
是否由
sscanf
计算。我会让测试
>=1
。@Basile Starynkevitch:它不应该计算它。规范规定:“执行
%n
指令不会增加执行
fscanf
函数时返回的赋值计数。”C标准规定:“执行%n指令不会增加执行完成时返回的赋值计数。”“但勘误表似乎与此相矛盾。可能明智的做法是不要对%n转换对返回值的影响进行任何假设。“@Basile Starynkevitch:我不知道他们从哪里得到这个,也不知道他们指的是什么“勘误表”。C99和更高版本的规范对此非常具体:
%n
不算数。此外,C99明确指出,
*
(分配抑制)不能与
%n
(未定义的beahvior)一起使用,这也与您链接中的文本相矛盾。我认为链接中的文本不是一个很好维护/审查的多重历史变化的联合体。@Basile Starynkevitch:“不对回报值进行任何假设。”在这种过于简单的情况下,当每次调用只读取一个字段时,这是可能的。但在读取多个字段的更复杂的情况下,如果不确切知道
%n
的行为,就不可能编写正确的代码。我不确定
%n
是否由
sscanf
计算。我会让测试
>=1
。@Basile Starynkevitch:它不应该计算它。规范规定:“执行
%n
指令不会增加执行
fscanf
函数时返回的赋值计数。”C标准规定:“执行%n指令不会增加执行完成时返回的赋值计数。”“但勘误表似乎与此相矛盾。可能明智的做法是不要对%n转换对返回值的影响进行任何假设。“@Basile Starynkevitch:我不知道他们从哪里得到这个,也不知道他们指的是什么“勘误表”。C99和更高版本的规范对此非常具体:
%n
不算数。此外,C99明确指出,
*
(分配抑制)不能与
%n
(未定义的beahvior)一起使用,这也与您链接中的文本相矛盾。我认为链接中的文本不是一个很好维护/审查的多重历史变化的联合体。@Basile Starynkevitch:“不对回报值进行任何假设。”在这种过于简单的情况下,当每次调用只读取一个字段时,这是可能的。但在读取多个字段的更复杂的情况下,如果不确切知道
%n
的行为,就不可能编写正确的代码。
const char *s = "1 2 3 4";
int tmp, cnt;

for (const char *p = s; sscanf(p, "%d%n", &tmp, &cnt) == 1; p += cnt)
  printf("%d\n", tmp);