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);