分割字符
- C/C++ code
#有字符串:"|2|fedc::213|52864|"#想得到: str1=2; str2="fedc:213"; str3=52864;#如果有空值:"|||52864|"#依然得到: str1=null; str2=null; str3=52864;#如果有空值:"|1||52864|"#依然得到: str1=1; str2=null; str3=52864;#我试过strtok()函数,当其中有空值时,该函数只执行一次,并返回52864,前面两个str1、str2没有值。#在下初学C语言,还望多多指教。
[解决办法]
用sscanf试试
- C/C++ code
#include <stdio.h>int main(){ char str[10] = {0}; char str1[10] ={0}; char str2[10] ={0}; char *pstr = "|2|fedc::213|52864|"; sscanf(pstr, "|%[^|]|%[^|]|%[^|]", str,str1,str2); printf("%s\n", str); printf("%s\n", str1); printf("%s\n", str2); return 0; }
[解决办法]
如果中间有空的情况下的输出:
- C/C++ code
#include <stdlib.h>#include <string.h>#include <stdio.h>/* * substitution of getNthValue which dosen't destroy the original value */ /* * argument: [IN] index -- the index array of deleted items(begin from 0) * [IN] count -- deleted itmes count. * [IN/OUT] value -- original string/return string * [IN] delimit -- delimitor len -- lenth of result; */int getNthValueSafe(int index, char *value, char delimit, char *result, int len){ int i=0, result_len=0; char *begin, *end; if(!value || !result || !len) return -1; begin = value; end = strchr(begin, delimit); while(i<index && end){ begin = end+1; end = strchr(begin, delimit); i++; } //no delimit if(!end){ if(i == index){ end = begin + strlen(begin); result_len = (len-1) < (end-begin) ? (len-1) : (end-begin); }else return -1; }else result_len = (len-1) < (end-begin)? (len-1) : (end-begin); memcpy(result, begin, result_len ); *(result+ result_len ) = '\0'; return 0;}void main(){ char str[115] = "|2||fedc::213||52864|"; char result[10][10]; int i = 0, j = 1; while(1) { i = getNthValueSafe( j, str, '|', result[j], sizeof(result)); printf("str%d:%s\n", j++, result[j]); if( 0 != i) break; }}