我从redis服务器收到下一个字符[]:
text = "e o 5\n\000\000\001\000\000\000\000\000\000\000\000\020\000\000\000"
我想删除'\ n'之后的所有内容:
text = "e o 5"
有时,我收到的文字长度是可变的
text = "x f 5 5 6 1\n\000\000\001\000\000\000\000\000\000\000\000\020\000\000\000"
或
text = "h f 5 1\n\000\000\001\000\000\000\000\000\000\000\000\020\000\000\000"
但是,每次都有'\ n'。
我该怎么办?使用C语言。
答案 0 :(得分:1)
只需尝试strtok()
。 strtok()
可以使用特定的分隔符分割字符串。
String: xxx\nyyy\nzzz
Delimiter: \n
Output:
xxx
yyy
zzz
假设buff
是一个char *
变量,它指向可写的存储区域。
char *buff = malloc(sizeof(BUFF_SIZE));
// Or char buff[BUFF_SIZE];
// Load data into buff
// split buff with `\n`
char *token;
token = strtok(buff, "\n");
if (token)
{
printf("First substring split by newline: %s\n", token);
}
while (token = strtok(NULL, "\n"))
{
printf("Next substring split by newline: %s\n", token);
}
查看有关strtok()
的更多信息,只需键入man strtok
。
答案 1 :(得分:0)
只需将\0
放在您感兴趣的数据的末尾即可。
strchr(text, '\n')[1] = '\0';
答案 2 :(得分:0)
从套接字接收时,您可能会从recv
(表示错误条件)或从接收到的数据长度中得到-1
的返回值。
ssize_t length = recv(sockfd, buffer, sizeof (buffer) - 1, 0);
if (length == -1) {
/* handle error condition */
}
您可能希望从此处使用length
将缓冲区转换为字符串:
buffer[length] = '\0';
然后,您可以使用strchr
(以及其他方法)来找到'\n'
并放置一个字符串终止符:
使用strchr
char *newline_ptr = strchr(buffer, '\n');
if (newline_ptr == NULL) {
/* No newline found */
}
else {
*newline_ptr = '\0';
}
使用strcspn
size_t newline_position = strcspn(buffer, "\n");
if (buffer[newline_position] == '\0') {
/* No newline found */
}
else {
buffer[newline_position] = '\0';
}
您还可以按照Joy Allens answer所述从此处安全使用strtok
。
我倾向于使用strcspn
,因为在原型制作过程中,您可以简单地编写buffer[strcspn(buffer, "\n")] = '\0';
而不会出现空指针被取消引用的风险。
正如我们自己的Jonathan Leffler指出的那样,如果分隔符大于一个字符,则需要花更多的工作来可靠地对它们进行标记。例如,您可能需要使用strstr
进行搜索。