1

CodeEval で C でフィズ バズ チャレンジを行っています。私のコンピューターでは問題なく動作しますが、CodeEval で送信すると失敗し、スコアが 0 になります。バッファ オーバーフロー エラーが発生したと表示されますが、コンピュータでは問題なく動作し、チャレンジが要求している正確な出力を生成しています。

/*Program Written and Designed by Ryan Sharpe*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void* printNumbers(int A, int B, int max)
{
  char* num = (char*)calloc(2, sizeof(char));
  int i = 1;
  while(i < max+1)
  {
    if(i % A == 0 && i % B > 0)
      strcpy(num,"F");
    else if(i % B == 0 && i % A > 0)
      strcpy(num,"B");
    else if(i % A == 0 && i % B == 0)
      strcpy(num,"FB");
    else
      strcpy(num,"X");

    if(strncmp(num,"X", 2) == 0)
      printf("%d%s", i, " ");
    else
      printf("%s%s", num, " "); 
    i++;   
  }
  printf("\n");
  free(num);
  return 0; 
}

int main(int argc, char** argv)
{
  FILE* f;
  f = fopen(argv[1], "r");
  int A, B, max;
  while(fscanf(f,"%d%d%d", &A, &B, &max) != EOF)
    printNumbers(A, B, max);
  fclose(f); 
  return 0;
}

CodeEval が与えているエラーは次のとおりです。これは、プログラムを実行できなかったものです:

* buffer overflow detected *: /binary terminated ======= Backtrace: ========= /lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x37)[0x7ff699aad807] /lib/x86_64-linux-gnu/libc.so.6(+0x109700)[0x7ff699aac700] /binary[0x4007a0] /binary[0x400857] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7ff6999c476d] /binary[0x400639] ======= Memory map: ======== 00400000-00401000 r-xp 00000000 ca:01 1334 /binary 00600000-00601000 r--p 00000000 ca:01 1334 /binary 00601000-00602000 rw-p 00001000 ca:01 1334
/binary 018c3000-018e4000 rw-p 00000000 00:00 0
[heap] 7ff69978d000-7ff6997a2000 r-xp 00000000 ca:01 134950
/lib/x86_64-linux-gnu/libgcc_s.so.1 7ff6997a2000-7ff6999a1000 ---p 00015000 ca:01 134950
/lib/x86_64-linux-gnu/libgcc_s.so.1 7ff6999a1000-7ff6999a2000 r--p 00014000 ca:01 134950
/lib/x86_64-linux-gnu/libgcc_s.so.1 7ff6999a2000-7ff6999a3000 rw-p 00015000 ca:01 134950
/lib/x86_64-linux-gnu/libgcc_s.so.1 7ff6999a3000-7ff699b58000 r-xp 00000000 ca:01 134939
/lib/x86_64-linux-gnu/libc-2.15.so 7ff699b58000-7ff699d57000 ---p 001b5000 ca:01 134939
/lib/x86_64-linux-gnu/libc-2.15.so 7ff699d57000-7ff699d5b000 r--p 001b4000 ca:01 134939
/lib/x86_64-linux-gnu/libc-2.15.so 7ff699d5b000-7ff699d5d000 rw-p 001b8000 ca:01 134939
/lib/x86_64-linux-gnu/libc-2.15.so 7ff699d5d000-7ff699d62000 rw-p 00000000 00:00 0 7ff699d62000-7ff699d84000 r-xp 00000000 ca:01 134929 /lib/x86_64-linux-gnu/ld-2.15.so 7ff699f6c000-7ff699f6f000 rw-p 00000000 00:00 0 7ff699f7f000-7ff699f84000 rw-p 00000000 00:00 0 7ff699f84000-7ff699f85000 r--p 00022000 ca:01 134929
/lib/x86_64-linux-gnu/ld-2.15.so 7ff699f85000-7ff699f87000 rw-p 00023000 ca:01 134929
/lib/x86_64-linux-gnu/ld-2.15.so 7fff5e021000-7fff5e042000 rw-p 00000000 00:00 0 [stack] 7fff5e1ff000-7fff5e200000 r-xp 00000000 00:00 0
[vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0
[vsyscall]
4

2 に答える 2

3
strcpy(num,"FB");

これが問題です。前に、 の 2 文字だけにスペースを割り当てましたが、この呼び出しは: 、、および null ターミネータにnum3 文字を書き込みます。これにより、未定義の動作が作成されます。numFB

それがあなたのコンピューターで動作するという事実は、あなたが幸運だったことを意味します.

于 2014-08-01T22:38:46.803 に答える
1

@DrewMcGowenが言ったことに加えて...

この行

while(fscanf(f,"%d%d%d", &A, &B, &max) != EOF)

する必要があります

while(fscanf(f,"%d%d%d", &A, &B, &max) == 3)

また、使用する代わりに:

char* num = (char*)calloc(3, sizeof(char));

あなたはただ使うことができます:

char num[3];

を使用malloc/callocすると、配列のサイズがわからない場合にのみ役立ちます。サイズがわかっている場合は、配列を使用することをお勧めします。

使用する場合:

char num[3];

線を必ず削除してください

free(num);
于 2014-08-01T22:43:27.090 に答える