this HackerRank problemを解決しようとしているときにこの現象が発生しました。このサイトでは、scanf
を使用して、適切な形式のデータをユーザーのコードに渡します。ここまでは順調ですね。scanf - 奇妙な動作:2つの連続した呼び出しが1つの異なる文字列と正しい文字列になります
p
文字列のペアがあり、各文字列は別々の行にあります。各ペアについて、共通の部分文字列を持つかどうかによって、YES
またはNO
を一度だけ印刷する必要があります。まあまあ。しかし、私は明らかな理由がないためにテストケースに失敗しています。
printf
でデバッグした後に、何らかの理由でscanf
を2回呼び出すと、最初の文字列が短いバージョンになり、2番目の文字列が追加されてオーバーラップします。 2番目の文字列は通常次の行に表示されます。 (デバッグモードでは、あなたがそうするかどうか)
問題のコード:失敗したテストケースの一つの
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int p;
scanf("%d", &p);
char *s1 = malloc(sizeof(s1));
char *s2 = malloc(sizeof(s2));
int len1, len2;
char *answers[] = { "NO", "YES"};
int answers_i;
for(int i = 0; i < p; ++i) {
scanf("%s", s1);
scanf("%s", s2);
printf("%s\n%s\n", s1, s2);
len1 = strlen(s1);
len2 = strlen(s2);
answers_i = 0;
for(int j = 0; j < len1 && answers_i == 0; ++j) {
for(int k = 0; k < len2; ++k) {
if(s1[j] == s2[k]) {
// printf("s1[%d]=%c s2[%d]=%c\n", j, s1[j], k, s2[k]);
answers_i = 1;
break;
}
}
}
// printf("%s\n", answers[answers_i]);
}
return 0;
}
入力:
10
dapkqnowwvdrknfvcmanjuroumppajrzklucroxvpfmcsclqa
ivtnjtgiogmwhqybjaxlktqbwsdhqrwovoavetymkpcco
hrtybirxncuiailznohfawjwipdtupnxnisbwcplozwrzt
ngdmqotxkpnuhmpfmajthzdtnztrqyugendiublcwp
rmpwlddwttapjzhdldjmuhmgruufltzszprzdcziigc
bbvvkeqkqekqqennyxqxkxnyxnyqnnybnbvnyqqe
annbjookwtqkoivcgbqckqtvgvktobctktgkkjiac
zsspfhmzpurrrlurdsdlrfldzyldfhudfedrszdpmsudh
yuuuydwovzawzamvydaaadkakukpynwfmpnmuaazokxkmjxawo
rqiqbhgscsetgihrrrgsqrlqgcbcbrettlehbeistbiqbisie
ibvmfltfdvlmentbfdemebbnvllfneeefnaamtblt
gukzzrqruyxsrqhyuggkrjujkwjhqhqsrqgkrkqxpszrzk
nakqzfroqouhgunxqvqbxwtibfodsvoilqrpvhtgzoholxd
bqluorjgkkrvmiptnxegxwlhrstiiafbfoxodzyguhdwi
oyvgelovlyevhhedoeolyhdevcvhgceydcdehgvoc
wsqswjnjpiarszzzxpmptrquwbnbzqiqqtzqnbajnpsjfaxr
hvkmgwawagozzabgmdmdvbbaxadawmbazvxohxzv
sfiltrslqepytjpfffqlrpejiueftrnisnnppnlpuficrjys
nvsovybaljmzenkfgayfoxzcjantbdidxflbkhbixgzk
qdphnbrjmznztnphhutkdbwjzmjwugtxggxchzcidngplj
が出力
dapkqnowwvdrknfvcmanjuroumppajrzivtnjtgiogmwhqybjaxlktqbwsdhqrwovoavetymkpcco
ivtnjtgiogmwhqybjaxlktqbwsdhqrwovoavetymkpcco
hrtybirxncuiailznohfawjwipdtupnxngdmqotxkpnuhmpfmajthzdtnztrqyugendiublcwp
ngdmqotxkpnuhmpfmajthzdtnztrqyugendiublcwp
rmpwlddwttapjzhdldjmuhmgruufltzsbbvvkeqkqekqqennyxqxkxnyxnyqnnybnbvnyqqe
bbvvkeqkqekqqennyxqxkxnyxnyqnnybnbvnyqqe
annbjookwtqkoivcgbqckqtvgvktobctzsspfhmzpurrrlurdsdlrfldzyldfhudfedrszdpmsudh
zsspfhmzpurrrlurdsdlrfldzyldfhudfedrszdpmsudh
yuuuydwovzawzamvydaaadkakukpynwfrqiqbhgscsetgihrrrgsqrlqgcbcbrettlehbeistbiqbisie
rqiqbhgscsetgihrrrgsqrlqgcbcbrettlehbeistbiqbisie
ibvmfltfdvlmentbfdemebbnvllfneeegukzzrqruyxsrqhyuggkrjujkwjhqhqsrqgkrkqxpszrzk
gukzzrqruyxsrqhyuggkrjujkwjhqhqsrqgkrkqxpszrzk
nakqzfroqouhgunxqvqbxwtibfodsvoibqluorjgkkrvmiptnxegxwlhrstiiafbfoxodzyguhdwi
bqluorjgkkrvmiptnxegxwlhrstiiafbfoxodzyguhdwi
oyvgelovlyevhhedoeolyhdevcvhgceywsqswjnjpiarszzzxpmptrquwbnbzqiqqtzqnbajnpsjfaxr
wsqswjnjpiarszzzxpmptrquwbnbzqiqqtzqnbajnpsjfaxr
hvkmgwawagozzabgmdmdvbbaxadawmbasfiltrslqepytjpfffqlrpejiueftrnisnnppnlpuficrjys
sfiltrslqepytjpfffqlrpejiueftrnisnnppnlpuficrjys
nvsovybaljmzenkfgayfoxzcjantbdidqdphnbrjmznztnphhutkdbwjzmjwugtxggxchzcidngplj
qdphnbrjmznztnphhutkdbwjzmjwugtxggxchzcidngplj
出力は入力と等しくなければなりませんが、明らかにそうではありません。最初の文字列は32文字でキャップされ、2番目の文字列全体が追加されます。しかし、2番目の文字列自体は変更されていません。この2つの間で正確に何が起きているのですかscanf
?
私はgets
(oops、廃止予定)とgetchar
を使用しましたが、問題は解決しません。文字列のサイズがわからないので、fgets
は役に立たない。私は他の標準的な選択肢を知らない。
注:誰もがHackerRankにこのコードを試してみたい場合は、Test against custom input
のためのボックスをチェックしてください&が、その後Run
ボタンをクリックし、上記の入力をコピー&ペースト。
'char * s1 = malloc(sizeof(s1));'は4バイトまたは8バイトを割り当てます。 – mch
制約によれば、入力のサイズは100000バイトまでです。 – Barmar