任意长度的3个数字的字符串 - 嵌入在空格和制表符中,下面用\t
标记表示:
123456789 \t 12345 \t6789\n
数字之间可以有任何空间和制表符的数量和组合。
例如,这也是有效的:
1 \t \t2\t\t\t\t\t \n3\n
提取3个数字的最有效方法是什么?
查看sscanf()但似乎需要字符串的确切格式,这是正确的吗?
谢谢。
答案 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;
}
}