scanf-奇怪的行为:两个连续调用会产生一个不同的字符串和一个正确的字符串
我在尝试解决问题时遇到了这种行为。此站点使用scanf-奇怪的行为:两个连续调用会产生一个不同的字符串和一个正确的字符串,c,string,scanf,C,String,Scanf,我在尝试解决问题时遇到了这种行为。此站点使用scanf将格式良好的数据传递给用户代码。到目前为止,一切顺利 有p对字符串,每个字符串位于单独的行上。对于每一对,我只需要打印一次YES或NO,这取决于这两个字符串是否具有公共子字符串。当然,这很简单。但是我没有任何明显的理由让测试失败 因此,在使用printf进行调试后,结果表明,当调用scanf两次时,由于某种原因,第一个字符串变为较短的版本,第二个字符串附加在它后面-重叠。第二个字符串通常出现在下一行 有问题的代码(在调试模式下,如果您愿意):
scanf
将格式良好的数据传递给用户代码。到目前为止,一切顺利
有p
对字符串,每个字符串位于单独的行上。对于每一对,我只需要打印一次YES
或NO
,这取决于这两个字符串是否具有公共子字符串。当然,这很简单。但是我没有任何明显的理由让测试失败
因此,在使用printf
进行调试后,结果表明,当调用scanf
两次时,由于某种原因,第一个字符串变为较短的版本,第二个字符串附加在它后面-重叠。第二个字符串通常出现在下一行
有问题的代码(在调试模式下,如果您愿意):
输出
dapkqnowwvdrknfvcmanjuroumppajrzivtnjtgiogmwhqybjaxlktqbwsdhqrwovoavetymkpcco
ivtnjtgiogmwhqybjaxlktqbwsdhqrwovoavetymkpcco
hrtybirxncuiailznohfawjwipdtupnxngdmqotxkpnuhmpfmajthzdtnztrqyugendiublcwp
ngdmqotxkpnuhmpfmajthzdtnztrqyugendiublcwp
rmpwlddwttapjzhdldjmuhmgruufltzsbbvvkeqkqekqqennyxqxkxnyxnyqnnybnbvnyqqe
bbvvkeqkqekqqennyxqxkxnyxnyqnnybnbvnyqqe
annbjookwtqkoivcgbqckqtvgvktobctzsspfhmzpurrrlurdsdlrfldzyldfhudfedrszdpmsudh
zsspfhmzpurrrlurdsdlrfldzyldfhudfedrszdpmsudh
yuuuydwovzawzamvydaaadkakukpynwfrqiqbhgscsetgihrrrgsqrlqgcbcbrettlehbeistbiqbisie
rqiqbhgscsetgihrrrgsqrlqgcbcbrettlehbeistbiqbisie
ibvmfltfdvlmentbfdemebbnvllfneeegukzzrqruyxsrqhyuggkrjujkwjhqhqsrqgkrkqxpszrzk
gukzzrqruyxsrqhyuggkrjujkwjhqhqsrqgkrkqxpszrzk
nakqzfroqouhgunxqvqbxwtibfodsvoibqluorjgkkrvmiptnxegxwlhrstiiafbfoxodzyguhdwi
bqluorjgkkrvmiptnxegxwlhrstiiafbfoxodzyguhdwi
oyvgelovlyevhhedoeolyhdevcvhgceywsqswjnjpiarszzzxpmptrquwbnbzqiqqtzqnbajnpsjfaxr
wsqswjnjpiarszzzxpmptrquwbnbzqiqqtzqnbajnpsjfaxr
hvkmgwawagozzabgmdmdvbbaxadawmbasfiltrslqepytjpfffqlrpejiueftrnisnnppnlpuficrjys
sfiltrslqepytjpfffqlrpejiueftrnisnnppnlpuficrjys
nvsovybaljmzenkfgayfoxzcjantbdidqdphnbrjmznztnphhutkdbwjzmjwugtxggxchzcidngplj
qdphnbrjmznztnphhutkdbwjzmjwugtxggxchzcidngplj
输出应该等于输入,但情况显然不是这样。第一个字符串被限制为32个字符,整个第二个字符串被追加到它。但第二个字符串本身没有改变。这两个scanf
调用之间到底发生了什么
我使用了gets
(oops,不推荐使用)和getchar
,但问题仍然存在fgets
是无用的,因为我事先不知道字符串的大小。我不知道其他标准的替代品
注意:如果有人想在HackerRank上试用此代码,请确保选中“根据自定义输入测试”框,复制并粘贴上面的输入,然后单击“运行”按钮。您的代码具有未定义的行为。代码中的问题在于将内存分配给
s1
和s2
。您分配sizeof(s1)
bytes,这是指针的大小。一旦读取的数据超过指针大小,就会写入超过分配的缓冲区,从而导致未定义的行为
问题约束要求| a |,| b |<105,因此分配应如下所示:
char *s1 = malloc(100000 + 1);
char *s2 = malloc(100000 + 1);
注意,为空终止符分配了一个额外字节
您需要在函数结束时调用
free(s1)
和free(s2)
。char*s1=malloc(sizeof(s1))
分配4或8个字节,这是不够的。约束说明输入的大小可以高达100000字节。在前面的问题中,scanf只分配了一个指针就可以了。这是否实际上是未定义的行为,而gcc恰好决定它应该自动分配额外的内存?@MiroslavCetojevic除非所有字符串的长度都小于3或7个字符,这取决于您的平台,这确实是未定义的行为malloc
在传递一个小数字时,分配的比您要求的多一点,因此即使使用UB,代码也可以正常运行(代码仍然不正确)。你可以测试你的UB代码。是的,大多数字符串都超过7个字符。我学到了一些新东西。
dapkqnowwvdrknfvcmanjuroumppajrzivtnjtgiogmwhqybjaxlktqbwsdhqrwovoavetymkpcco
ivtnjtgiogmwhqybjaxlktqbwsdhqrwovoavetymkpcco
hrtybirxncuiailznohfawjwipdtupnxngdmqotxkpnuhmpfmajthzdtnztrqyugendiublcwp
ngdmqotxkpnuhmpfmajthzdtnztrqyugendiublcwp
rmpwlddwttapjzhdldjmuhmgruufltzsbbvvkeqkqekqqennyxqxkxnyxnyqnnybnbvnyqqe
bbvvkeqkqekqqennyxqxkxnyxnyqnnybnbvnyqqe
annbjookwtqkoivcgbqckqtvgvktobctzsspfhmzpurrrlurdsdlrfldzyldfhudfedrszdpmsudh
zsspfhmzpurrrlurdsdlrfldzyldfhudfedrszdpmsudh
yuuuydwovzawzamvydaaadkakukpynwfrqiqbhgscsetgihrrrgsqrlqgcbcbrettlehbeistbiqbisie
rqiqbhgscsetgihrrrgsqrlqgcbcbrettlehbeistbiqbisie
ibvmfltfdvlmentbfdemebbnvllfneeegukzzrqruyxsrqhyuggkrjujkwjhqhqsrqgkrkqxpszrzk
gukzzrqruyxsrqhyuggkrjujkwjhqhqsrqgkrkqxpszrzk
nakqzfroqouhgunxqvqbxwtibfodsvoibqluorjgkkrvmiptnxegxwlhrstiiafbfoxodzyguhdwi
bqluorjgkkrvmiptnxegxwlhrstiiafbfoxodzyguhdwi
oyvgelovlyevhhedoeolyhdevcvhgceywsqswjnjpiarszzzxpmptrquwbnbzqiqqtzqnbajnpsjfaxr
wsqswjnjpiarszzzxpmptrquwbnbzqiqqtzqnbajnpsjfaxr
hvkmgwawagozzabgmdmdvbbaxadawmbasfiltrslqepytjpfffqlrpejiueftrnisnnppnlpuficrjys
sfiltrslqepytjpfffqlrpejiueftrnisnnppnlpuficrjys
nvsovybaljmzenkfgayfoxzcjantbdidqdphnbrjmznztnphhutkdbwjzmjwugtxggxchzcidngplj
qdphnbrjmznztnphhutkdbwjzmjwugtxggxchzcidngplj
char *s1 = malloc(100000 + 1);
char *s2 = malloc(100000 + 1);