You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Linux /etc/hosts文件处理代码输出异常原因咨询

为什么你的/etc/hosts处理C代码会输出异常?

咱们来一步步拆解你代码里的问题,这些问题共同导致了异常输出:

  • 循环终止条件错误
    你在遍历字符串时用了while(*c != EOF && *c != '\n'),但EOF是文件结束的标志,不是一个实际存在于字符串中的字符——fgets会把读取到的行内容以'\0'(字符串结束符)结尾。这个错误会让程序在读完当前行的有效内容后,继续访问str数组之外的未知内存,导致乱码、程序崩溃或者不可预测的输出。
    正确的终止条件应该是while(*c != '\0'),这样才能在字符串结束时停止遍历。

  • 遗漏行末尾的最后一个单词
    你的代码只在遇到空格或制表符时才输出当前积累的单词,但每行最后一个单词后面没有空白字符,而是直接接'\n''\0'。这就导致最后一个单词永远不会被输出,比如127.0.0.1 localhost中的localhost会被留在pattern数组里,要么丢失,要么被下一行的内容覆盖后输出错误的结果。
    解决方法是在每行遍历结束后,检查i是否大于0(也就是有没有未输出的单词),如果有的话,手动添加字符串结束符并输出。

  • 未处理连续空白字符
    如果行里有多个连续的空格或制表符(比如不小心敲了两个空格),你的代码会多次进入else分支,此时pattern是空的(i=0),会输出空字符串加空格,导致输出里出现多余的空格。更糟的是,如果行开头有空白字符,程序会先输出一个空的“单词”。
    可以修改逻辑:先跳过所有连续的空白字符,再开始积累单词,这样就能避免这个问题。

  • 缓冲区溢出风险与未初始化问题
    你定义的pattern[256]没有初始化,而且在积累字符时没有检查i是否超过255(数组的最大索引)。如果遇到长度超过255的单词(虽然hosts里不太可能,但代码要严谨),会导致缓冲区溢出,破坏其他内存区域的数据,引发各种异常。
    建议在每次积累字符前判断i < sizeof(pattern)-1,确保不会越界;同时可以在循环开始前用memset(pattern, 0, sizeof(pattern))初始化数组,避免残留的垃圾数据影响输出。

  • 文件打开失败后未终止程序
    fopen("/etc/hosts","r")返回NULL时,你只打印了错误信息,但程序继续执行后面的代码,这会导致操作NULL指针(host_file),直接引发程序崩溃。
    应该在打印错误信息后加上return 1;或者exit(1);,终止程序运行。

  • 指针操作的冗余问题
    你写的*c++;虽然语法上没问题,但其实多余了解引用操作——你只需要移动指针,不需要读取当前字符的值,直接写c++;更清晰,也避免不必要的操作。

内容的提问来源于stack exchange,提问作者Dmitry Kozyrev

火山引擎 最新活动