2012-09-06 40 views
3

我有一个格式为<item1>:<item2>:<item3>的字符串中的字符数组是什么是最好的分解方式,以便我可以分别打印不同的项目?我应该循环访问数组,还是有一些可以帮助的字符串函数?替换字符串中的字符C

+2

您将受益于阅读任何初学者ç书,甚至K&R –

+0

退房'的sscanf()'或'的strtok()'或做你的实现并不难.. – Jack

回答

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

您可以尝试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; 
} 
+0

-1,这是一个对从字符串文字初始化的字符指针运行'strtok()'真的是个坏主意。文字是只读的,但'strtok()'修改它。这很容易崩溃。 – unwind

+0

感谢您的建议。我只是很快写了样本,但没有考虑到这个问题。谢谢。 – wbao

0

strtok是最好的选择,在这里想补充两两件事:

1)strtok修改/操纵原始的字符串,并剥离出来的分隔符,并

2)如果你有一个多线程程序,你可以使用strtok_r这是线程安全/可重入版本。

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 ;)