如何使用C截断特定的char []

时间:2018-06-24 06:37:37

标签: c

我从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语言。

3 个答案:

答案 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进行搜索。