CodeEval提交,程序在我的计算机上工作,但在我提交时不能。 C

时间:2014-08-01 22:34:29

标签: c fizzbuzz

我正在使用CodeEval上的C进行fizz buzz挑战。它在我的计算机上工作正常,但当我在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]

2 个答案:

答案 0 :(得分:3)

strcpy(num,"FB");

这就是问题所在。之前,您只为num中的两个字符分配空间,但此调用会将3个字符写入numFB和空终止符。这会产生未定义的行为。

它在您的计算机上运行的事实只是意味着您很幸运。

答案 1 :(得分: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);