我试图在遇到换行符时标记字符串。
rest = strdup(value);
while ((token = strtok_r(rest,"\n", &rest))) {
snprintf(new_value, MAX_BANNER_LEN + 1, "%s\n", token);
}
其中“value”是一个字符串,例如“这是一个示例\n这里是换行符”
但是上面的函数没有标记“value”,并且“new_value”变量按原样出现,即“这是一个示例\n这里是换行符”。
有什么建议可以克服这个问题吗?
谢谢, 普尔尼玛
最佳答案
您的代码中发生的一些事情:
strtok
和strtok_r
将要标记化的字符串作为第一个参数。同一字符串的后续标记化应传递 NULL。 (可以使用不同的分隔符标记同一字符串。)- 第二个参数是可能的分隔符字符串。在您的情况下,您应该传递
"\n"
。 (strtok_r
会将字符的延伸视为单个中断。这意味着对"a\n\n\nb"
进行标记将产生两个标记。) - strtok_r 的第三个参数是函数的内部参数。它将标记下一个标记化应该开始的位置,但您不需要使用它。只需定义一个
char *
并传递其地址即可。 - 特别是,不要将源字符串变量重新用作状态。在您的示例中,您将丢失
strdup
ed 字符串的句柄,因此您以后无法释放它,而您应该这样做。 - 目前尚不清楚您如何确定您的标记化“不起作用”。您重复将 token 打印到同一个字符缓冲区。您只想保留最后一个换行符之后的部分吗?在这种情况下,请使用
strchrr(str, '\n')
。如果结果不是NULL
,那么它就是你的“尾部”。如果它是NULL
,那么整个字符串就是你的尾部。
以下是标记字符串的工作原理:
char *rest = strdup(str);
char *state;
char *token = strtok_r(rest, "\n", &state);
while (token) {
printf("'%s'\n", token);
token = strtok_r(NULL, "\n", &state);
}
free(rest);
关于c - 遇到换行符时标记字符串 - 不工作换行符无法被识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58999522/