C 如何将字符串拆分一次?

C 如何将字符串拆分一次?,c,string,C,String,我想在第一个空格字符处将字符串分成两部分。例如,我有一个字符串“Hay Guys LOL”,拆分时,“Hay”应该在一个变量中,而“Guys LOL”应该在另一个变量中 我已经研究过像strtok这样的函数,它可以工作,但我不希望循环然后组合字符串 以下是我目前拥有的(正在尝试sscanf): 谢谢 让它: sscanf(test, "%s %[^\r\n]", p1, p2); 第一个%s将只读取第一个字符串,直到第一个空格读取“Hay”。接下来,扫描集将一直读取,直到在字符串中找不到'\r

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

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

以下是我目前拥有的(正在尝试sscanf):

谢谢

让它:

sscanf(test, "%s %[^\r\n]", p1, p2);
第一个
%s
将只读取第一个字符串,直到第一个空格读取“Hay”。接下来,扫描集将一直读取,直到在字符串中找不到
'\r'
'\n'
[]
中的
^
反转扫描集)。因此,
%[^\r\n]
将把字符串的其余部分读入
p2

更新

正如@Adam Rosenfield所说,为了避免缓冲区溢出,您需要通过
sscanf
限制放入
p1
p2
的字符数。指定字符数,如
%10[^\r\n]
%10s
。因为这些数字需要是格式字符串的一部分,所以您可能希望在使用之前动态生成格式字符串

char format_string[MAX];

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

sscanf (test, format_string, p1, p2);

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

注意缓冲区溢出!在这种情况下,如果
p1
p2
的长度都是16字节,那么最好使用格式字符串
%16s%16[^\r\n]“
。我正在尝试接受答案-说我可以在50秒内这样做,考虑您是否真的想
”\r\n“
在字符串中,而不仅仅是
“\n”
。C仅使用
“\n”
表示行结束;它在输入和输出到文本流时转换为系统特定的行尾(通常是
“\n”
“\r\n”
)。这取决于你要用这个字符串做什么。
char format_string[MAX];

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

sscanf (test, format_string, p1, p2);