所以我目前正在使用 strsep()分隔给定字符串为
的字符串。char str[] = "line 01\n"
"line 02\n"
"line 03\n"
"line 04\n"
"line 05\n"
"line 06\n"
"line 07\n"
"line 08\n"
"line 09\n"
"line 10\n";
,我正在使用strsep(&str, "\n")
来分隔它们。因此,我担心的是我实际上使用的是两个定界符“ \”和“ n”对吗?然后,如何将分隔符设为“ \ n”。因为提取“第10行”后,strsep会将“ \”替换为“ \ 0”。但是str []本身以“ \ 0”终止,并且我的定界符之一是“ \”,因此它实际上会将“ \ 0”中的“ \”视为另一个字符串,因此我会提取出不必要的空字符串。
答案 0 :(得分:2)
在字符串和字符文字中,对转义序列进行处理,以使\n
和\0
成为单个字符“换行符”和“字符串终止符”-正如您认为的那样,它们不是两个 个字符。
此重要细节在第5阶段的C11 5.1.1.2 Translation Phases
中:
字符常量和字符串文字中的每个源字符集成员 和转义序列 被转换为执行字符集的相应成员;如果没有对应的成员,则将其转换为实现定义的成员,而不是空(宽)字符。
也在5.2.1 Character sets /2
中:
在字符常量或字符串文字中,执行字符集的成员应由源字符集 的相应成员或由反斜杠\后跟一个或多个字符组成的转义序列表示。
您可以使用的实际转义序列已在标准中的多个位置进行了详细说明,由于答案可能已经足够大了,因此我在此处不会全部显示。
但是,基于对问题的仔细阅读,我怀疑您的 actual 问题是一种误解,为什么使用换行符分隔字符串会导致“第10行”之后的字符串为空。
如果考虑以下字符串,则很容易理解:
A|B|C
如果您基于|
进行分隔,则会得到三个值A
,B
和C
。如果对字符串A|B|
执行相同的操作,则会得到A
,B
和空字符串。
几乎可以肯定,您的字符串正在发生什么。因为您的最后几个字符是line 10\n
,并且您使用\n
作为分隔符,所以最后一个\n
之后实际上是一个 extra 空字符串。
我怀疑如果您取消最后的换行符,您的问题将会消失。