通过换行符错误使用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]
vs
char*
)。如果这是正确的,更改将不会影响分段错误。(别误会:不应该有
&
。但是,这一次可能不是分段错误的根源。)@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);