在一串其他字符中查找数字的最有效方法是什么?

时间:2014-06-16 01:07:08

标签: c linux string algorithm parsing

任意长度的3个数字的字符串 - 嵌入在空格和制表符中,下面用\t标记表示:

123456789 \t 12345 \t6789\n

数字之间可以有任何空间和制表符的数量和组合。

例如,这也是有效的:

1    \t \t2\t\t\t\t\t \n3\n  

提取3个数字的最有效方法是什么?

查看sscanf()但似乎需要字符串的确切格式,这是正确的吗?

谢谢。

2 个答案:

答案 0 :(得分:5)

最明显/最简单的是sscanf

if (sscanf(buffer, "%d%d%d", &v1, &v2, &v3) == 3) {
    /* extracted 3 numbers successfully */

%d格式说明符会跳过空白(包括\t\n个字符),因此变量额外的东西并不重要。它也会跳过空格,这可能是也可能不是你想要的。

答案 1 :(得分:1)

sscanf()真的很慢。在ascii中,标签和空格都是< ' 0',所以你可以这样做:

char* sz = "123456789 \t 12345 \t6789\n"
char* aNum[10] = { 0 };
int cNum = 0;
for (int i=0 ; sz[i] ; ++i) {
  if (sz[i] < '0')
    sz[i] = 0, cNum++;
  else if (!aNum[cNum])
      aNum[cNum] = sz + i;
}

使用更多循环可以提高效率

char* sz = "123456789 \t 12345 \t6789\n"
char* aNum[10] = { 0 };
int cNum = 0;
for (int i=0 ; sz[i] ; ++i) {
  if (sz[i] >= '0') {
      aNum[cNum++] = sz + i;
      for ( ; sz[i]>='0' ; ++i) { }
      sz[i] = 0;
  }
}