C用sscanf或其他方法从我的字符串中提取一些数据

时间:2011-12-05 16:44:04

标签: c

我在C中很穷,我只是学习它。我有一个字符串:

 a          322  4.1   5.2

(使用空格/制表符/空格)

 b     1.22  4.1   5.2 4.11

什么是获得没有空格的所有字符串的方法 这样:

string[0]="s";
string[1]="322";
string[2]="4.1";
等等......

修改

我只是想找到最好/最快的方法,对于大行号。 (70-100.000字符串)

使用Android / galaxy s / linkedlist

测试:71.000阵列用C ++(没有字符串/ std)花了大约7-8秒,用java花了14秒

4 个答案:

答案 0 :(得分:2)

原始海报使用sscanf()询问的内容:

#include <stdio.h>
#include <string.h>

int main(){
    // 5 elements, each of 32 bytes, 31 for characters the 32nd for storing \0
    char string[5][32];
    char* inputString="a          322  4.1   5.2";
    memset(string,0,sizeof(string));//to initialize to NULL, always be safe on C
    sscanf(inputString,"%s%s%s%s",string[0],string[1],string[2],string[3]);
    printf("res0= %s\n",string[0]);
    printf("res1= %s\n",string[1]);
    printf("res2= %s\n",string[2]);
    printf("res2= %s\n",string[3]);
    return 0;
}

这将打印:

res0= a
res1= 322
res2= 4.1
res2= 5.2

答案 1 :(得分:1)

正如Martin Beckett所说,您可以使用strtok,这是推荐用于移植性的。但是,如果您的系统有strsep可用,我会继续使用它。它的BSD手册页在示例部分有解决方案。

#include <string.h>
int main()
{
    char input[] = " a          322  4.1   5.2"; 
    char **ap, *argv[5], *inputstring = input;

    for (ap = argv; (*ap = strsep(&inputstring, " \t")) != NULL;)
        if (**ap != '\0')
            if (++ap >= &argv[10])
                break;

    /* degubber output for `p argv':
     *
     * $1 = {
     *  0x1001009a1 "a",
     *  0x1001009ac "322",
     *  0x1001009b1 "4.1",
     *  0x1001009b7 "5.2",
     *  0x0
     * }
     */
}

答案 2 :(得分:0)

分割字符串的最安全方法(特别是如果你不知道字符串可能包含的内容)是strtok

您可能还需要检查如何在'C'

中创建string []数组

答案 3 :(得分:0)

for(int i=0,j=0; str[i]; i++)
{
    if(str[i]==' ')
        continue;
    str2[j]=str[i];
    j++;
}

在上面的代码中,str是您之前的字符串,str1是新字符串。