首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

字符串截取请问

2013-07-01 
字符串截取请教!一个字符串,结构是:前两个为数字,从第三个起,可能是数字,也可能是字符。最后一个是0xFFAC之

字符串截取请教!
一个字符串,结构是:前两个为数字,从第三个起,可能是数字,也可能是字符。最后一个是0xFFAC之类的一个十六进制数字。各个变量间用逗号间隔。请问如何一个个截取出来?  
  例如,它可能是: “5,10,str,0xFFBC”,也有可能是“5,10,100,200,0xFFBC”。
  我想把前两位(因为肯定是数字)存在int型变量中。如果第三位、第四位。。是数字,就也存在int型变量中,否则就存在字符型变量里。另外,如果第三位不是数字,就一定会是字符串"str"。最后一个则肯定是一个十六进制的数字。

  多谢大家赐教!
[解决办法]
先用逗号把字符串分开,可以考虑strtok,strchr等函数,c++可以考虑stl::string::find,stl::string::substr
然后判断第三个字符串是否为str
[解决办法]
写个函数,split然后分割成数组
[解决办法]
#include <stdio.h>
#include <string.h>

int main()
{
    char input[1024] = {0};
    char * substr;
    printf("Input you string:");
    scanf("%s", input);
    substr = strtok(input, ",");
    while(substr)
    {
        printf("substr:%s\n", substr);
        // TODO process it.
        substr = strtok(NULL, ",");
    }
    return 0;
}

[解决办法]


#include <stdio.h>
#include <iostream>

int num = 0;
char *save[30];
int fun(char, int);
int fun(char *a, int len)
{
     char *p;
     p = strtok(a,",");
     if(!p)
           return -1;
     printf("%s\n",p);
     save[num]=p;
     num++;
     while(p = strtok(NULL,",")) {
       save[num]=p;  
       printf("%s\n",p);
       num++;
     }
     return 1;
}
int main(void)
{
    int ret;
    int i = 0;
    int j = 0;
    int k = 0;
    int integer[10];
    char *char_num[10];
    char a[100]="5,10,str,0xFFBC";
    //char a[100]="5,10,100,200,0xFFBC";
    ret = fun(a,100);
    if(ret < 0) {
           printf("数据不对\n");       
    }
    printf("有%d个数据\n",num);
    for(i = 0; i < num; i++){
          if((ret = atoi(save[i]))!=0) {


                  integer[k++] = ret;
                  printf(" 是整数%d\n",integer[k-1]);
          }
          else {
              char_num[j++]=save[i];
              printf("是字符串%s\n",char_num[j-1]);   
           }   
    }
    system("pause");   
    return 0;
}


[解决办法]
unsigned long convert(const char* pStr)  // 将16进制字符串转换成无符号整形

    unsigned long var=0; 
    unsigned long t; 
    int len = strlen(pStr);  
    if (len > 8) //最长8位  
        return -1; 
    char *strTemp = new char[len+1];
    char *str = strTemp;
    strncpy(str ,pStr ,len+1);
    strupr(str);//统一大写 
    if (str[0] == '0' && str[1] == 'X')
    {
        str+=2;
    }
    for (; *str; str++) 
    {  
        if (*str>='A' && *str <='F')   
            t = *str-55;//a-f之间的ascii与对应数值相差55如'A'为65,65-55即为A  
        else   
            t = *str-48; 
        var<<=4;  
        var
[解决办法]
=t; 
    } 
    delete []strTemp;
    return var;


 int main()
{
    string str("5,100,123,0xFFBC");
    size_t nPos = 0;
    nPos = str.find(",");
    int m = atoi(str.substr(0 ,nPos).c_str());  // 第一个数字
    int n = atoi(str.substr(nPos+1 ,str.find("," ,nPos+1 ) - nPos-1).c_str()); // 第二个数字
    nPos = str.find("," ,nPos+1);
    if (str.substr(nPos+1 ,3) == "str")
    {
        // 是字符串"str"  // 第三个是字符串"str"
    }
    else
    {
        int k = atoi(str.substr(nPos+1 ,str.find("," ,nPos+1 ) - nPos-1).c_str()); //第三个数字


    }
    nPos = str.find("," ,nPos+1);
    int h = convert(str.substr(nPos+1 ).c_str() );  // 最后一个数字
    return 0;
}


[解决办法]

#include <ctype.h>
#include <stdio.h>

void catch(const char* value)
{
/* 根据所获取的字符串作相应的动作,这里举例进行简单的打印而已 */
printf("%s\n", value);
}

void analyze(const char* str)
{
char value[32];
char ch;
int i = 0;

while(ch = *str++)
{
if(ch == ',')
{
value[i] = '\0';
catch(value);
i = 0;
}
else if(isalpha(ch) 
[解决办法]
 isdigit(ch))
{
value[i++] = ch;
}
}
value[i] = '\0';
catch(value);
}

int main(int argc, char* argv[])
{
analyze("5,10,str,0xFFBC");
analyze("5,10,100,200,0xFFBC");

return 0;
}


引用:
  一个字符串,结构是:前两个为数字,从第三个起,可能是数字,也可能是字符。最后一个是0xFFAC之类的一个十六进制数字。各个变量间用逗号间隔。请问如何一个个截取出来?  
  例如,它可能是: “5,10,str,0xFFBC”,也有可能是“5,10,100,200,0xFFBC”。
  我想把前两位(因为肯定是数字)存在int型变量中。如果第三位、第四位。。是数字,就也存在int型变量中,否则就存在字符型变量里。另外,如果第三位不是数字,就一定会是字符串"str"。最后一个则肯定是一个十六进制的数字。

  多谢大家赐教!

[解决办法]
用strtol函数进行转换,可以指定16进制。

引用:
  还有一个问题,截取到字符串“0xFFAB”后,我怎么将它转化为一个无符号的long型变量?
 我试了几个函数,都是返回0.

[解决办法]
费那事儿!
%i Decimal, hexadecimal, or octal integer. Pointer to int. 
long L;
sscanf("0xFFBC","%i",&L);


[解决办法]
#include <stdio.h>
char s[]="123 ab 4";
char *p;
int v,n,k;
void main() {
    p=s;
    while (1) {
        k=sscanf(p,"%d%n",&v,&n);
        printf("k,v,n=%d,%d,%d\n",k,v,n);
        if (1==k) {
            p+=n;
        } else if (0==k) {
            printf("skip char[%c]\n",p[0]);
            p++;
        } else {//EOF==k
            break;
        }
    }
    printf("End.\n");
}
//k,v,n=1,123,3
//k,v,n=0,123,3
//skip char[ ]
//k,v,n=0,123,3
//skip char[a]
//k,v,n=0,123,3
//skip char[b]
//k,v,n=1,4,2
//k,v,n=-1,4,2
//End.

热点排行