2011-09-07 62 views
0

我想在第一个空格字符处将字符串拆分为两部分。例如,我有一个字符串“Hay Guys LOL”,分割时,“Hay”应该在一个变量中,而“Guys LOL”在另一个变量中。如何分割一次字符串?

我已经研究过像strtok这样的函数 - 它可以工作,但我宁愿不循环,然后组合字符串。

这是我现在有(尝试的sscanf):

char test[32]; 
strcpy(test, "Hay Guys LOL\r\n"); 

// p1 should have "Hay", and p2 have "Guys LOL"? 
char p1[16], p2[16]; 
sscanf(test, "%s %s\r\n", p1, p2); 

printf("p1: %s\n", p1); 
printf("p2: %s\n", p2); 

谢谢!

+2

考虑一下你是否真的想在你的字符串中使用'“\ r \ n”而不是'“\ n”'。 C只使用'“\ n”'来表示一行结尾;它在输入和输出到文本流时转换为系统特定的行结束(通常为“\ n”或“\ r \ n”')。这取决于你将要使用的字符串。 –

回答

2

让它:

sscanf(test, "%s %[^\r\n]", p1, p2); 

第一%s将只读取第一个字符串高达第一blankspace读“干草”。接下来,扫描集将读取,直到'\r''\n'而不是在字符串中找到(^中的[]颠倒了该集合)。因此%[^\r\n]会将字符串的其余部分读入p2

UPDATE

由于@Adam罗森菲尔德说,为了避免缓冲区溢出,你需要限制由sscanf投入p1p2字符的数字。您指定的字符数为%10[^\r\n]%10s。由于这些数字需要是格式字符串的一部分,因此您可能希望在使用前动态生成格式字符串。

char format_string[MAX]; 

sprintf (format_string, "%%%ds %%%d[^\\r\\n]", 10, 10); 

sscanf (test, format_string, p1, p2); 

在长度限制的格式字符串上面先做出,然后使用它。请注意转义字符。 %%用于在输出中打印单个%,而\\用于在输出字符串中打印单个\

+0

完美的作品!非常感谢你 – jo1

+1

注意缓冲区溢出!如果'p1'和'p2'每个长度为16个字节,在这种情况下最好使用格式字符串'“%16s%16 [^ \ r \ n]”'。 –

+0

我想接受答案 - 说我可以在50秒内做到这一点 – jo1