使用`sscanf`与`istringstream`相同?

时间:2014-11-15 03:03:55

标签: c++ scanf istringstream

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

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

我们可以使用sscanf吗?

2 个答案:

答案 0 :(得分:2)

如果您可以使用strtok

将字符串分解为单独的标记
  char str[] ="1 2 3 4";
  char * pch;
  pch = strtok (str," ");
  while (pch != NULL)
  {
    int tmp;
    sscanf( pch, "%d", &tmp );
    printf( "%d \n", tmp );
    pch = strtok (NULL, " ");
  }

否则,scanf支持%n转换,允许您计算到目前为止消耗的字符数(我没有测试过,可能存在我未考虑的陷阱);

  char str[] ="1 2 3 4";
  int ofs = 0;
  while ( ofs < strlen(str) )
  {
    int tmp, ofs2;
    sscanf( &str[ofs], "%d %n", &tmp, &ofs2 );
    printf( "%d \n", tmp );
    ofs += ofs2;
  }

答案 1 :(得分:2)

您可以使用此

非常接近地模拟它
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);