首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用gdb调试我的字符串令牌程序

用gdb调试我的字符串令牌程序
EN

Stack Overflow用户
提问于 2016-01-18 00:19:28
回答 1查看 661关注 0票数 2

我有一小部分代码,它以换行符分隔的单词作为输入,输出(word,1)作为输出。下面是代码:

代码语言:javascript
运行
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
    char *str1, *str2, *token;
    char *saveptr1;
    char buffer[100];
    while (fgets(buffer, sizeof(buffer), stdin) != NULL) {
        token = strtok_r(buffer, '\n', &saveptr1);
        printf("(%s,1)\n", token);
    } 
    exit(EXIT_SUCCESS);
}

此代码工作正常,并提供预期的输出。但是,当我使用gdb执行代码时,在第9行中会出现以下错误:strtok_r行。

程序接收信号SIGSEGV,分割故障。strtok_r ()在./sysdeps/x86_64/strTok.S: 101 ./sysdeps/x86_64/strTok.S:没有这样的文件或目录。

这真是令人费解。我甚至没有“踏进”strtok_r行,我只是“下一个”它,也就是说,跨过去。为什么在GDB期间抛出此错误?我很焦虑,因为我有一个真正的,更大的程序,我无法调试,因为这个问题。实际上,对于大多数字符串函数(strncmpstrncpy)来说,都会出现这个问题。

编辑:编译器确实警告过使用整数做指针的赋值,而没有在这一行进行强制转换,我应该将2和2放在一起。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-18 02:11:11

如果将字符文本而不是字符串文本传递给strtok_r,库函数strtok_r会崩溃,试图取消引用无效指针。

GDB试图显示位于strtok_r中的../sysdeps/x86_64/strtok.S的程序集源代码(它从标准C库调试信息中知道这一点),但它无法在该位置找到源文件。

当然,您应该以这样的方式更正代码:

代码语言:javascript
运行
复制
token = strtok_r(buffer, "\n", &saveptr1);

最好用-Wall -Wextra -Werror启用尽可能多的来自编译器的警告,并修复代码,直到编译器不再检测到任何可疑的代码。

事实上,您提到了使用strncpy:这个函数非常容易发生错误。它不像大多数人想的那样,它永远不是正确的工具。阅读它的文档,并仔细验证您是否正确地使用它,以及在这些地方没有更好的替代方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34845496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档