运行时错误(SIGSEGV)

时间:2009-08-29 10:05:57

标签: c

任何人都可以告诉我,在接受1位或2位整数的下列程序中是否有错误,直到它遇到数字42,之后它打印出先前输入的数字?当我将此上传到球体在线判断网站时它说编译成功但运行时错误(SIGSEGV)。

#include <stdio.h>
int main()
{
  int i;
  FILE *fp;
  fp=fopen("\\db.txt","w+");
  if(fp==NULL)
  {
   printf("file not exitsts and cant be created");
   system("exit");
  }
  while(1)
  {
   scanf("%d",&i);
   if(i==42)
   break;
   else
   {
    fprintf(fp,"%d\n",i); 
   }    
  }
  fclose(fp);
  fp=fopen("\\db.txt","r+");
  if(fp==NULL)
  {
   printf("file not exitsts and cant be created");
   system("exit");
  }
  fscanf(fp,"%d",&i);
  printf("%d\n",i); 
  while((!feof(fp)))
  {
    fscanf(fp,"%d",&i);
    if(!feof(fp))
    printf("%d\n",i);                
  }

  fclose(fp);
  return 0;
}

7 个答案:

答案 0 :(得分:2)

我不知道你的想法:

system("exit");

会这样做,但退出C程序的方法是:

exit(1);

答案 1 :(得分:2)

好像你正试图回答这个问题:http://www.spoj.pl/problems/TEST/。此问题当然不要求您从文件中读取或写入任何内容,并且其服务器可能不允许您在其磁盘上打开文件。即使它确实如此,你也试图在非Windows服务器上使用windows风格的路径(带反斜杠)。即使它确实允许文件创建和Windows风格的路径分离,您也试图在文件系统根目录中创建文件,并且他们几乎肯定不允许文件创建那里

结合每个人都指出它实际上没有退出程序的system("exit")问题,这会导致你收到一个NULL文件指针并在你尝试使用它时崩溃。

重新阅读问题描述 - 你过度思考它。它没有说任何你必须等到42才能打印出其他数字。所有你要做的就是打印输入的内容,直到你得到42.这应该使解决方案更简单。它不应该是一个温和的挑战性问题;它只是让你熟悉他们的系统。

答案 2 :(得分:1)

你应该替换

system("exit");

exit(1);

或者,因为您已经在main

return 1;

我怀疑SIGSEGV是由于您无法写入文件\\db.txt而导致的,但程序仍在继续,因为system("exit")没有导致它终止。

在半相关的说明中,SIGSEGV通常是Unix信号,Unix上的路径分隔符是/而不是\

答案 3 :(得分:1)

我不确切知道SEGV的原因,但我想这是因为输入与您的预期不符。在任何情况下,这一行都不符合你的想法:

system("exit");

答案 4 :(得分:0)

  1. 您收到错误的哪一行?
  2. 是你的空#include意图?我认为它应该意味着#include
  3. 您是否收到了每个输入的错误或只是42?
  4. 问候

答案 5 :(得分:0)

SIGSEGV是一个访问冲突错误,表示null指针。由于system("exit")没有做任何事情,fp设置为null,然后当您尝试使用该指针时(例如使用fprintf())...繁荣,你的程序崩溃了。

system("exit")替换为return 1(或您想要的任何错误代码),应该修复它。

答案 6 :(得分:0)

$ gcc -Wall test.c -o test
test.c: In function ‘main’:
test.c:8: warning: implicit declaration of function ‘system’
$ ./test 
1 
2
3
10
42
1
2
3
10

Could not reproduce

但是,我确实同意system("exit")不符合你的期望。通过该调用,您退出的是由程序生成的子shell,然后继续。来自system手册页

  

system()函数交给   命令的参数命令   口译员sh(1)。呼唤   进程等待shell完成   执行命令,忽略SIGINT   和SIGQUIT,并阻止SIGCHLD。