任何人都可以告诉我,在接受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;
}
答案 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)
问候
答案 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
但是,我确实同意system("exit")
不符合你的期望。通过该调用,您退出的是由程序生成的子shell,然后继续。来自system
手册页
system()函数交给 命令的参数命令 口译员sh(1)。呼唤 进程等待shell完成 执行命令,忽略SIGINT 和SIGQUIT,并阻止SIGCHLD。