通过换行符字符错误将字符串拆分为strtok

时间:2013-04-02 22:45:41

标签: c string parsing compiler-errors

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

这个想法是服务器向客户端发送消息,客户端通过其他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)

2 个答案:

答案 0 :(得分:5)

替换

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

rc = read(sockfd, response, 256);

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

答案 1 :(得分:5)

有可能(a)response未初始化,(b)read()函数无法读取字符串中的终止空值。要演示,请使用:

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

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

rc语句中使用它之前,你应该检查printf()是否为负(读取失败)还是零(EOF),并且在将它传递给{{ 1}}等等,所以也许更好的治疗方法是:

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的声明;如果是rc,则255值可能表示从unsigned char rc调用返回-1。

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