【问题标题】:C string splitting with strtok by newline character error换行符错误用strtok分割C字符串
【发布时间】:2013-04-02 22:45:40
【问题描述】:

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

这个想法是服务器正在向客户端发送消息,并且客户端通过换行符将消息拆分为其他 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)

【问题讨论】:

  • 发布您的确切段错误输出
  • 您无法发布 seg 故障转储?
  • 我没有看到 sockfd 初始化部分,可能是这个原因。
  • Socket 和服务器和客户端的通信正常,我只是省略了与问题无关的部分代码

标签: c string parsing compiler-errors


【解决方案1】:

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

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';

我仍然收到错误...

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

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

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

【讨论】:

    【解决方案2】:

    替换

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

    rc = read(sockfd, response, 256);
    

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

    【讨论】:

    • 天哪,我一直忽略了响应声明。是的,这就是问题
    • 我认为&amp;responseresponse 指向同一个位置,尽管类型不同(char (*)[256]char *)。如果这是正确的,则更改不会影响分段错误。 (不要误会我的意思:&amp; 不应该在那里。但是,这一次它可能不是分段错误的根源。)
    • @JonathanLeffler 是对的,虽然在概念上省略 adressof 运算符是一个很好的解决方案,但这并不能解决问题(也不应该)。
    猜你喜欢
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 2022-07-06
    • 2013-11-15
    • 1970-01-01
    • 2013-02-15
    • 2014-09-23
    • 1970-01-01
    相关资源
    最近更新 更多