字符串截取请教!
一个字符串,结构是:前两个为数字,从第三个起,可能是数字,也可能是字符。最后一个是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;
}
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.