我能够使这个C程序在Ubuntu上正常工作,但在Mac上它总是在矩阵的第一行给出一些奇怪的输出。
当我尝试打印client.publish("devices/" + device_id + "/mytopicname/messages", "{id=123}", qos=1)
时,它会弄乱整条线! (你需要一个file.txt来运行代码)
temp[0][k]
答案 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'更强大,无论最后一行是什么)