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