2

我遇到了用换行符分割字符串的问题。

这个想法是服务器正在向客户端发送消息,并且客户端通过换行符将消息拆分为其他 2 个字符串

我收到分段错误错误。

这是它接收、拆分和输出结果的客户端部分。

    char response[256];

    rc = read(sockfd, &response, 256);

    printf("The response is: %s\n", response);//prints the string in 2 lines

    char * pch;
    pch = strtok (response, "\n");

    printf("Part 1 -> %s\n\n", pch); // ERROR

    pch = strtok (NULL, "\n");
    printf("Part 2 -> %s\n\n", pch);

错误信息显示:

Segmentation fault (core dumped)
4

2 回答 2

5

代替

rc = read(sockfd, &response, 256);

rc = read(sockfd, response, 256);

response已经是指向缓冲区的指针。

于 2013-04-02T22:54:33.307 回答
5

可能是 (a)response未初始化,并且 (b)read()函数未读取字符串中的终止空值。为了演示,使用:

int rc = read(sockfd, response, sizeof(response));

printf("The response is: %.*\n", rc, response);

在语句中使用它之前,您应该真正检查rc它既不是负数(读取失败)也不是零(EOF)printf(),并且在将它传递给 et al 之前,您需要 null 终止strtok(),所以也许更好的处理是:

int rc = read(sockfd, response, sizeof(response)-1);

if (rc <= 0)
    ...error or EOF...

response[rc] = '\0';

我仍然得到错误...

您已将发生错误的代码标记为:

char *pch;
pch = strtok(response, "\n");

printf("Part 1 -> %s\n\n", pch); // ERROR

核心转储最合理的原因是pch包含空指针。因此,为了保护自己,请测试以下结果strtok()

char *pch = strtok(response, "\n");

if (pch == 0)
    printf("strtok() failed\n");
else
    printf("Part 1 -> %s\n\n", pch);

您应该确保如果pch为 null,则不要继续使用它。

您没有显示rc;的声明 如果是unsigned char rc,则 255 值可能表示read()调用返回 -1。

此外,我展示的代码假定 的定义response()作为数组可见(在文件范围或函数范围内,而不是作为函数的参数)。当数组为函数参数时,sizeof(response)返回与 相同的值sizeof(char *),一般不是数组的大小。

于 2013-04-02T22:56:23.470 回答