如何从字符串中提取字符 现在有一个字符串(或字符数组), str1[30]={"5.3$6.4$3.1$1.23$2.53$"};其中存有五个独立的子字符串"5.3" "6.4" "3.1" "1.23" "2.53"};分别用$连接,如何将这五个字符串从str1中提取出来,成为独立的字符串, 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 int k = 0;//记录当前的字串的起始位置for(int i = 0; i < 30; i++){ if(str1[i] == '$') { //拷贝字串 for(int j = k; j < i; j++) { // } k = i + 1;//新字串从'$'的下一个开始 }} CString str = "5.3$6.4$3.1$1.23$2.53$"; CString strTest; int nPos = 0; strTest = str.Tokenize("$",nPos); AfxMessageBox(strTest); while(!strTest.IsEmpty()) { strTest = str.Tokenize("$",nPos); AfxMessageBox(strTest); } 非常感谢,各位的回帖速度真是有点超过我的想象了。对于上面的回答小弟有几个问题不解,请各位不吝赐教。问题一、tfq2002(天涯闲游) 的方法,关键的地方就是省略的地方,不知道如何从str1[30]={"5.3$6.4$3.1$1.23$2.53$"};中将字符串拷贝。问题二、shishulv(小记者)的方法,就是Tokenize,一编译就报错,说'Tokenize' : is not a member of 'CString',不知道为什么。 str1[30]={"5.3$6.4$3.1$1.23$2.53$"};LPTSTR lpstr1 = str1;LPTSTR lp1 = NULL;LPTSTR lp2 = NULL;LPTSTR lp3 = NULL;LPTSTR lp4 = NULL;LPTSTR lp5 = NULL;TCHAR cstr1[5]={0};TCHAR cstr2[5]={0};TCHAR cstr3[5]={0};TCHAR cstr4[5]={0};TCHAR cstr5[5]={0};lp1 = cstr1;lp2 = cstr2;lp3 = cstr3;lp4 = cstr4;lp5 = cstr5;int nLen = strlen(lpstr1);int i = 1;while(*lpstr1 && nLen -- >0){ swithc(i) { case 0: while(*lpstr1 != '$' && nLen -- >0) { *lp1 ++ = *lpstr1; } i++; break; case 1: while(*lpstr1 != '$' && nLen -- >0) { *lp2 ++ = *lpstr1; } i++; break; case 2: while(*lpstr1 != '$' && nLen -- >0) { *lp3 ++ = *lpstr3; } i++; break; case 3: while(*lpstr1 != '$' && nLen -- >0) { *lp4 ++ = *lpstr4; } i++; break; case 4: while(*lpstr1 != '$' && nLen -- >0) { *lp5 ++ = *lpstr5; } i++; break; } *lpstr1++;}//==没有测试。你可以把SWITHC里面的循环写在函数。 char* st[5];int i = 0, j=0;while(i<30){ while(i<30 && str1[i] != '$') { strcat(st[j],str1[i]); i++; } i++; j++} 上面的方法没有测试过,下面这个方法是正确的:CString st[5];int i=0, j=0;while(i<30 && j<5){ while(i<30 && str1[i] != '$') { st[j] += str1[i]; i++; } i++; j++;} #include <string.h>#include <stdio.h>char string[] = "A string\tof ,,tokens\nand some more tokens";char seps[] = " ,\t\n";char *token;int main( void ){ printf( "Tokens:\n" ); /* Establish string and get the first token: */ token = strtok( string, seps ); while( token != NULL ) { /* While there are tokens in "string" */ printf( " %s\n", token ); /* Get next token: */ token = strtok( NULL, seps ); }} MFC有现成的API可以用:AfxExtractSubString不过这个API在MSDN中没有记录。我是在跟踪MFC源代码时发现的。可以把以某字符分开的字符串提取出来比如一个字符串char *szBuf为:abc?defg?hig?为分隔符, AfxExtractSubString可以把abc, defg, hig分开。比如要得到defg这个串可以这样调用CString strRet;AfxExtractSubString(strRet, szBuf, 0, '?');第一个参数是返回的结果,第二个是原字符串,第三个参数是第几个子字符串,最后一个参数是分隔符。 用AfxExtractSubStringint i=0;CString szTemp;while(AfxExtractSubString(szTemp, str1, i, '$')){ i++; AfxMessageBox(szTemp);} 关于GCC编译核心的问题 请教RegQueryValueEx的注册表操作正确方法? 什么情况下会用到代理和存根? 把一个数字(INT)变成字符(CHAR) ,如何做. 再散一百分求vc++6.0下载地址(昨天发啦,被删啦,还扣了分,不明白) [自学讨论区]何东健主编《数字图像处理》 在VC中怎么去除地图上面的方里网(谁帮忙解决给满分) 大家来谈一谈:VC++技术内幕(第四版)学习体会 DELPHI转C++日志 静态库函数需要导出吗?//。。。。 问大家个AlphaBlend的问题,急 IE控件如何得到HTML特殊字符的编码
int k = 0;//记录当前的字串的起始位置
for(int i = 0; i < 30; i++)
{
if(str1[i] == '$')
{
//拷贝字串
for(int j = k; j < i; j++)
{
//
} k = i + 1;//新字串从'$'的下一个开始
}
}
CString strTest;
int nPos = 0;
strTest = str.Tokenize("$",nPos);
AfxMessageBox(strTest);
while(!strTest.IsEmpty())
{
strTest = str.Tokenize("$",nPos);
AfxMessageBox(strTest);
}
LPTSTR lpstr1 = str1;
LPTSTR lp1 = NULL;
LPTSTR lp2 = NULL;
LPTSTR lp3 = NULL;
LPTSTR lp4 = NULL;
LPTSTR lp5 = NULL;
TCHAR cstr1[5]={0};TCHAR cstr2[5]={0};TCHAR cstr3[5]={0};TCHAR cstr4[5]={0};
TCHAR cstr5[5]={0};
lp1 = cstr1;lp2 = cstr2;lp3 = cstr3;lp4 = cstr4;lp5 = cstr5;
int nLen = strlen(lpstr1);
int i = 1;
while(*lpstr1 && nLen -- >0)
{
swithc(i)
{
case 0:
while(*lpstr1 != '$' && nLen -- >0)
{
*lp1 ++ = *lpstr1;
}
i++;
break;
case 1:
while(*lpstr1 != '$' && nLen -- >0)
{
*lp2 ++ = *lpstr1;
}
i++;
break;
case 2:
while(*lpstr1 != '$' && nLen -- >0)
{
*lp3 ++ = *lpstr3;
}
i++;
break;
case 3:
while(*lpstr1 != '$' && nLen -- >0)
{
*lp4 ++ = *lpstr4;
}
i++;
break;
case 4:
while(*lpstr1 != '$' && nLen -- >0)
{
*lp5 ++ = *lpstr5;
}
i++;
break;
}
*lpstr1++;
}
//==没有测试。你可以把SWITHC里面的循环写在函数。
int i = 0, j=0;
while(i<30)
{
while(i<30 && str1[i] != '$')
{
strcat(st[j],str1[i]);
i++;
}
i++;
j++
}
下面这个方法是正确的:
CString st[5];
int i=0, j=0;
while(i<30 && j<5)
{
while(i<30 && str1[i] != '$')
{
st[j] += str1[i];
i++;
}
i++;
j++;
}
#include <stdio.h>char string[] = "A string\tof ,,tokens\nand some more tokens";
char seps[] = " ,\t\n";
char *token;int main( void )
{
printf( "Tokens:\n" );
/* Establish string and get the first token: */
token = strtok( string, seps );
while( token != NULL )
{
/* While there are tokens in "string" */
printf( " %s\n", token );
/* Get next token: */
token = strtok( NULL, seps );
}
}
AfxExtractSubString
不过这个API在MSDN中没有记录。我是在跟踪MFC源代码时发现的。可以把以某字符分开的字符串提取出来
比如一个字符串char *szBuf为:
abc?defg?hig
?为分隔符, AfxExtractSubString可以把abc, defg, hig分开。
比如要得到defg这个串
可以这样调用
CString strRet;
AfxExtractSubString(strRet, szBuf, 0, '?');
第一个参数是返回的结果,第二个是原字符串,第三个参数是第几个子字符串,最后一个参数是分隔符。
CString szTemp;
while(AfxExtractSubString(szTemp, str1, i, '$'))
{
i++;
AfxMessageBox(szTemp);
}