我遇到了用新行字符分割字符串的问题。
这个想法是服务器向客户端发送消息,客户端通过其他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)
答案 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)
相同的值,这通常不是数组的大小。