我有一个格式为<item1>:<item2>:<item3>
的字符串的字符数组是什么是分解它的最佳方法,以便我可以单独打印不同的项目?我应该只是循环遍历数组,还是有一些可以帮助的字符串函数?
答案 0 :(得分:1)
我会使用sscanf
函数
char * str = "i1:i2:i3";
char a[10];
char b[10];
char c[10];
sscanf(str, "%s:%s:%s", a, b, c);
这不安全,因为它容易受到缓冲区溢出的影响。在Windows中,有sscanf_s作为安全黑客。
答案 1 :(得分:1)
你可以试试strtok: 这里有一些示例代码来获取由 - 或|
分隔的子字符串#include <stdio.h>
#include <string.h>
int main(int argc,char **argv)
{
char buf1[64]={'a', 'a', 'a', ',' , ',', 'b', 'b', 'b', '-', 'c','e', '|', 'a','b', };
/* Establish string and get the first token: */
char* token = strtok( buf1, ",-|");
while( token != NULL )
{
/* While there are tokens in "string" */
printf( "%s ", token );
/* Get next token: */
token = strtok( NULL, ",-|");
}
return 0;
}
答案 2 :(得分:0)
strtok
是最好的选择,想在这里添加两件事:
1)strtok
修改/操纵原始字符串并将其从分隔符中删除,
2)如果您有多线程程序,最好使用strtok_r
这是线程安全/可重入的版本。
答案 3 :(得分:0)
只需遍历字符串,每次点击':'
时,都会打印自上次出现':'
以来所读取的内容。
#define DELIM ':'
char *start, *end;
start = end = buf1;
while (*end) {
switch (*end) {
case DELIM:
*end = '\0';
puts(start);
start = end+1;
*end = DELIM;
break;
case '\0':
puts(start);
goto cleanup;
break;
}
end++;
}
cleanup:
// ...and get rid of gotos ;)