奇怪的输出总是出现在MacOS上,但不出现在Ubuntu上

时间:2018-05-25 14:47:39

标签: c macos ubuntu

我能够使这个C程序在Ubuntu上正常工作,但在Mac上它总是在矩阵的第一行给出一些奇怪的输出。

当我尝试打印client.publish("devices/" + device_id + "/mytopicname/messages", "{id=123}", qos=1) 时,它会弄乱整条线! (你需要一个file.txt来运行代码)

temp[0][k]

2 个答案:

答案 0 :(得分:3)

问题在于,虽然您考虑到read没有添加NUL字符来终止字符串并且您自己添加它,但是您没有给出数组足够的空间来存储它。所以你只需要在创建数组时增加大小:

char c[size+1];

为了完整起见,你还应该检查read的返回值,因为如果有错误,它可以是-1。

进一步发现了另外两个问题。你有这一行:

temp[j][tot + 1] = '\0';

它来自for循环

for(j = 0 ; j < index; j++)

循环结束后j将超出temp的范围。实际上,该行应位于循环内部,因为您要将\0添加到temp中的每个字符串。所以你应该删除它以及你拥有这一行:

    temp[j][k] = '\n';

添加此行以终止字符串。

    temp[j][k+1] = '\0';

至于k,我看不到在此循环之前将其设置为0的任何迹象。您只能在结尾处将其重置为0,因此k周围的第一次可以包含任何值。将k=0移动到循环中发生的第一件事。

可能很容易出现其他类似的问题 - 这是使用valgrind调试代码的地方,这是一个非常好的主意,因为它会告诉你这些类型的错误发生在哪里。

答案 1 :(得分:0)

您永远不会将索引设置为0!

我的编译器在第37行发出警告:

warning: variable index is uninitialized when used here
    index++

此循环之后:

for (k = 0; k < size; k++)
{
    if (c[k] == '\n')
    {
        index++;
    }
}

k的值为size。但是你使用它就好像它是0.它适用于下一行,因为你在循环结束时将它重置为0。

当然,如Chris所示,您应该在sz位置为终止空值保留一些位置:

char c[size + 1];

最后但并非最不重要的一点是,如果您的测试文件未以新行结束(并非所有编辑人员都在最后一行添加),那么您的index值将会被一个人关闭......

可能是其他人......

你应该从中学到什么:

  • 始终初始化自动变量
  • 始终确保循环开头的变量值
  • 使用调试器在运行时控制值

我的建议是进一步:

  • 使用fgets按行读取输入(比计算'\ n'更强大,无论最后一行是什么)
  • 在开始编码之前用伪代码编写程序的一般结构
  • 添加评论,解释会发生什么。如果在编写代码时看起来没用,但在几周后阅读时会有很大帮助