在C中以'\ n'作为分隔符的strsep()

时间:2018-09-16 13:13:20

标签: c

所以我目前正在使用 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”中的“ \”视为另一个字符串,因此我会提取出不必要的空字符串。

1 个答案:

答案 0 :(得分:2)

在字符串和字符文字中,对转义序列进行处理,以使\n\0成为单个字符“换行符”和“字符串终止符”-正如您认为的那样,它们不是两个 个字符。

此重要细节在第5阶段的C11 5.1.1.2 Translation Phases中:

  

字符常量和字符串文字中的每个源字符集成员 和转义序列 被转换为执行字符集的相应成员;如果没有对应的成员,则将其转换为实现定义的成员,而不是空(宽)字符。

也在5.2.1 Character sets /2中:

  

在字符常量或字符串文字中,执行字符集的成员应由源字符集 的相应成员或由反斜杠\后跟一个或多个字符组成的转义序列表示。

您可以使用的实际转义序列已在标准中的多个位置进行了详细说明,由于答案可能已经足够大了,因此我在此处不会全部显示。


但是,基于对问题的仔细阅读,我怀疑您的 actual 问题是一种误解,为什么使用换行符分隔字符串会导致“第10行”之后的字符串为空。

如果考虑以下字符串,则很容易理解:

A|B|C

如果您基于|进行分隔,则会得到三个值ABC。如果对字符串A|B|执行相同的操作,则会得到AB和空字符串。

几乎可以肯定,您的字符串正在发生什么。因为您的最后几个字符是line 10\n,并且您使用\n作为分隔符,所以最后一个\n之后实际上是一个 extra 空字符串。

我怀疑如果您取消最后的换行符,您的问题将会消失。