我的代码在http://codeforces.com上的问题400A上给出了错误的答案,而它在我的笔记本电脑上工作正常。有人向我建议可以通过增加字符串的大小来解决问题,在这之后,代码被接受了。为了找到原始代码中的错误,我在两个代码中放置了print语句,以找出出错的地方并在代码强制中提交了两个提交。在以下提交中,我只是将数组w
的大小从12更改为13:
http://codeforces.com/contest/400/submission/5948686
http://codeforces.com/contest/400/submission/5948717
正如您所看到的,在前一种情况下,内部循环不会为i=0
执行,但在后一种情况下则执行。为什么会发生这种情况(我知道字符串大小必须保持大于字符串,但这与i=0
内部循环的功能有什么关系?)
答案 0 :(得分:1)
这是我最好的猜测,但这取决于所使用的编译器,内存方式的布局, - 可能无法确切知道。其他人可能有更好的猜测。
所以这就是可能发生的事情:scanf读取13个字符 - 12个字符,加上一个空终止字符(\ 0)。 null终止符的ascii值为0
正确地将12个字符放入缓冲区,然后\ 0字符可能覆盖ar
的第一个值。因此内循环变为(j = 0; j <0; j ++)
故事的道德是缓冲区溢出是坏的。