通过换行符错误使用strtok进行C字符串拆分
我遇到了用新行字符拆分字符串的问题 其思想是服务器向客户端发送一条消息,客户端通过换行符将消息拆分为其他两个字符串 我得到一个分段错误 这是客户端部分,用于接收、拆分和输出结果通过换行符错误使用strtok进行C字符串拆分,c,string,parsing,compiler-errors,C,String,Parsing,Compiler Errors,我遇到了用新行字符拆分字符串的问题 其思想是服务器向客户端发送一条消息,客户端通过换行符将消息拆分为其他两个字符串 我得到一个分段错误 这是客户端部分,用于接收、拆分和输出结果 char response[256]; rc = read(sockfd, &response, 256); printf("The response is: %s\n", response);//prints the string in 2 lines char * pch
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)
替换
rc = read(sockfd, &response, 256);
与
response
已经是指向缓冲区的指针。可能是(a)response
未初始化,以及(b)read()
函数未读取字符串中的终止null。要演示,请使用:
int rc = read(sockfd, response, sizeof(response));
printf("The response is: %.*\n", rc, response);
在printf()
语句中使用之前,您应该检查rc
既不是负值(读取失败)也不是零(EOF),并且在将其传递给strtok()
等之前,您需要空终止,因此更好的处理方法可能是:
int rc = read(sockfd, response, sizeof(response)-1);
if (rc <= 0)
...error or EOF...
response[rc] = '\0';
堆芯转储最合理的原因是pch
包含空指针。因此,为了保护您自己,请从strtok()
测试结果:
您应该确保如果pch
为空,则不继续使用它
您没有显示rc
的声明;如果是unsigned char rc
,则255值可能表示从read()
调用返回的-1
另外,我展示的代码假设
response()
的定义是作为数组可见的(在文件范围或函数范围内,而不是作为函数的参数)。当数组是一个函数参数时,sizeof(response)
返回与sizeof(char*)
相同的值,该值通常不是数组的大小。发布准确的seg故障输出无法发布seg故障转储?我没有看到sockfd初始化部分,这可能是因为Socket和服务器与客户端之间的通信工作正常,我只是省略了代码中与问题无关的部分,我一直忽略了响应声明。是的,这就是问题所在。我认为&response
和response
指向同一个位置,尽管类型不同(char(*)[256]
vschar*
)。如果这是正确的,更改将不会影响分段错误。(别误会:不应该有&
。但是,这一次可能不是分段错误的根源。)@JonathanLeffler是对的,虽然从概念上省略了adressof操作符是一个很好的解决方案,但这并不能解决问题(也不应该)。
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
char *pch = strtok(response, "\n");
if (pch == 0)
printf("strtok() failed\n");
else
printf("Part 1 -> %s\n\n", pch);