标题:怎样把字符串提取为数字
只看楼主
szchen2018
Rank: 2
等 级:论坛游民
帖 子:39
专家分:21
注 册:2021-11-20
结帖率:91.67%
已结贴  问题点数:10 回复次数:8 
怎样把字符串提取为数字
uint8_t ver[20]={0};
uint8_t str[20]={0};
str[0] = 'v';
str[1] = '1';
str[2] = '.';
str[3] = '2';
str[4] = '.';
str[5] = '3';
str[6] = '.';
str[7] = '4';

怎样把str字符串提取为数字存到ver里面呢?
就是想要得到这样的效果ver[0]=1;ver[1]=2;ver[2]=3;ver[3]=4;
搜索更多相关主题的帖子: str 字符串 提取 数字 效果 
2021-12-14 19:57
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:10 
程序代码:
#include <stdio.h>

int main( void )
{
    const char* str = "v1.2.3.4";
    char ver[20];

    char* q = ver;
    for( const char* p=str; *p; ++p )
        if( *p>='0' && *p<='9' )
            *q++ = *p;
    *q = '\0';

    puts( ver );
}
2021-12-15 08:19
szchen2018
Rank: 2
等 级:论坛游民
帖 子:39
专家分:21
注 册:2021-11-20
得分:0 
回复 2楼 rjsp
ver打印出来的值是ASCII 1 2 3 4,不是数字1 2 3 4呢,请大佬再帮忙看看,谢谢!

ver[0]=0x31(49)
ver[1]=0x32(50)
ver[2]=0x33(51)
ver[3]=0x34(52)

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
    (void) argc;
    (void) argv;
    const char* str = "v1.2.3.4";
    char ver[20];
    int i=0;

    char* q = ver;
    const char* p=str;
    for(; *p; ++p )
        if( *p>='0' && *p<='9' )
            *q++ = *p;
    *q = '\0';

    puts( ver );
    for (i=0;i<20;i++)
        printf("ver[%d]=0x%X(%d)\n",i,ver[i],ver[i]);

    return 0;
}
2021-12-15 10:04
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
如果是数字,那你怎么知道是否结束?
比如 "v1.0.0.1" 你得到 1, 0, 0, 1, 0, 0, ……
比如 "v1.0.0.10" 你得到的还是 1, 0, 0, 1, 0, 0, ……

假如你希望 "v1.0.0.10" 得到是 1, 0, 0, 10, 0, 0, ……,那你为什么不肯说清楚,且也不肯举个非个位数的例子?
且这还有新的问题,
比如 "v1.10.0" 你得到 1, 10, 0, 0, 0, 0, ……
比如 "v1.10.0.0" 你得到的还是 1, 10, 0, 0, 0, 0, ……
那如何区分呢?

程序代码:
#include <stdio.h>
#include <stdint.h>

int main( void )
{
    const char* str = "v1.2.3.4";

    uint8_t ver[20];
    size_t ver_size = 0;

    for( size_t p=0; ; )
    {
        size_t len;
        int x = sscanf( str+p, "%hhu%zn", &ver[ver_size], &len );
        if( x == EOF )
            break;
        if( x == 0 )
            ++p;
        else
        {
            p += len;
            ++ver_size;
        }
    }

    for( size_t i=0; i!=ver_size; ++i )
        printf( "%hhu\n", ver[i] );
}
2021-12-15 10:29
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
如果你能确保都是 "v1.2.3.4" 这种格式,那么最简单
程序代码:
#include <stdio.h>
#include <stdint.h>

int main( void )
{
    const char* str = "v1.2.3.4";
    uint8_t ver[4];

    if( 4 == sscanf(str,"v%hhu.%hhu.%hhu.%hhu",ver+0,ver+1,ver+2,ver+3) )
        printf( "%hhu %hhu %hhu %hhu", ver[0], ver[1], ver[2], ver[3] );
    else
        puts( "格式错误" );
}


如果啥也不能确定,只是提取一切可能的数值,那么
程序代码:
#include <stdio.h>
#include <stdint.h>

int main( void )
{
    const char* str = "v1.2.3.4";

    uint8_t ver[20];
    size_t ver_size = 0;

    for( size_t p=0; ; )
    {
        size_t len = 0;
        sscanf( str+p, "%*[^0-9]%zn", &len );
        p += len;

        int n = sscanf( str+p, "%hhu%zn", &ver[ver_size], &len );
        if( n == EOF )
            break;
        p += len;
        ++ver_size;
    }

    for( size_t i=0; i!=ver_size; ++i )
        printf( "%hhu\n", ver[i] );
}

2021-12-15 10:43
szchen2018
Rank: 2
等 级:论坛游民
帖 子:39
专家分:21
注 册:2021-11-20
得分:0 
回复 5楼 rjsp
抱歉,是我描述的不够清楚。
比如 "v1.0.0.10" 希望得到 1, 0, 0, 10,  ……,

只有这样如下这样的格式,也就是不是字符串数字的后面都是零
"v1.2.3.4000000000000"
"v1.2.3.4.500000000000"
"v1.2.3.4.5.60000000000"
......

C编译环境版本可能是C89,没有您的版本高,这个sscanf可接受的参数格式可能不同,
如下代码会报错[Warning] unknown conversion type character 'h' in format [-Wformat=],

const char* str = "v1.2.3.4";
    uint8_t ver[4];

    if( 4 == sscanf(str,"v%hhu.%hhu.%hhu.%hhu",ver+0,ver+1,ver+2,ver+3) )
        printf( "%hhu %hhu %hhu %hhu", ver[0], ver[1], ver[2], ver[3] );
    else
        puts( "格式错误" );
2021-12-15 11:34
diycai
Rank: 8Rank: 8
等 级:贵宾
威 望:19
帖 子:147
专家分:895
注 册:2021-5-18
得分:0 
程序代码:
#include <stdlib.h>
#include <string.h>

void main()
{
    int ver[20]={0};
    char str[20]={0};
    str[0] = 'v';
    str[1] = '1';
    str[2] = '.';
    str[3] = '2';
    str[4] = '.';
    str[5] = '3';
    str[6] = '.';
    str[7] = '4';
    str[8] = '5';
    int i, j, k, flag;
    for (i=0; str[i]; i++)
    {
        if (str[i]<'1' || str[i]>'9')
        {
            str[i] = 0;
        }
    }
    for (j=k=flag=0; j<i; j++)
    {
        if (str[j])
        {
            if (flag == 0)
            {
                ver[k++] = atoi(str+j);
                flag = 1;
            }
        }
        else
        {
            flag = 0;
        }
    }
    for (i=0; i<k; i++)
    {
        printf("%d ", ver[i]);
    }
    printf("\n");
}
2021-12-15 12:34
szchen2018
Rank: 2
等 级:论坛游民
帖 子:39
专家分:21
注 册:2021-11-20
得分:0 
回复 7楼 diycai
谢谢大佬,验证可以。
我还有如下格式想要转换,如果可以还请帮忙在看看,谢谢!

如果"v1.2.4.5.a.b.c.d.e.f.A.B.C.D.E.F" 希望得到 1, 2, 3, 4,10,11,12,13,14,15,10,11,12,13,14,15,要怎么改呢?
2021-12-15 21:15
szchen2018
Rank: 2
等 级:论坛游民
帖 子:39
专家分:21
注 册:2021-11-20
得分:0 
回复 8楼 szchen2018
这样就可以满足要求了
int AsciiToHex(char *s,char *hex,int n)
{

    int i;

    for(i=0;*s&&i<n;s++)

    {

        if(*s>'0'&&*s<='9')

            hex[i++]=*s-'0';

        else if(*s>'a'&&*s<='f')

            hex[i++]=10+*s-'a';

        else if(*s>'A'&&*s<='F')

            hex[i++]=10+*s-'A';

    }

    return i;
}
2021-12-21 10:11



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-507872-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018237 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved