ошибка времени выполнения (SIGSEGV) - PullRequest
0 голосов
/ 29 августа 2009

Может кто-нибудь сказать мне, что не так в следующей программе, которая принимает 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 ]

2 голосов
/ 29 августа 2009

Похоже, вы пытаетесь ответить на это: http://www.spoj.pl/problems/TEST/. Эта проблема, конечно, не требует от вас чтения или записи чего-либо из файла, и их сервер может не позволить вам открывать файлы на своем диске. Даже если это так, вы пытаетесь использовать путь в стиле Windows (с обратной косой чертой) на сервере, который не является Windows. И даже если это позволяет создавать файлы и разделять пути в стиле Windows, вы пытаетесь создать свой файл в корневом каталоге файловой системы, и они почти наверняка не позволяют создавать файлы там .

В сочетании с проблемой system("exit"), когда все указали, где программа на самом деле не выходит из программы, это приведет к тому, что вы получите нулевой указатель на файл и произойдет сбой при попытке его использовать.

Перечитайте описание проблемы - вы слишком обдумываете ее. В нем нигде не сказано, что вам нужно ждать, пока вы не получите 42, чтобы распечатать другие числа. Все, что вам нужно сделать, это напечатать обратно введенное, пока вы не получите 42. Это должно сделать решение намного проще. Это не должно быть даже слегка сложной проблемой; он просто должен познакомить вас с их системой.

2 голосов
/ 29 августа 2009

Я не знаю, что вы думаете:

system("exit");

подойдет, но способ выхода из программы на C:

exit(1);
1 голос
/ 29 августа 2009

Я не знаю точно причину SEGV, но я думаю, это потому, что ввод не соответствует тому, что вы ожидаете. В любом случае, эта строка не делает то, что вы думаете:

system("exit");
1 голос
/ 29 августа 2009

Вы должны заменить

system("exit");

с

exit(1);

или, потому что вы уже в main:

return 1;

Я подозреваю, что SIGSEGV вызван тем, что вы не можете записать в файл \\db.txt, но программа продолжается, потому что system("exit") не вызывает его прекращение.

На полусвязанной ноте SIGSEGV обычно является сигналом Unix, а разделителями пути в Unix являются /, а не \.

0 голосов
/ 29 августа 2009
$ 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") не то, что вы ожидаете. То, из чего вы выходите с этим вызовом, является подоболочкой, которая порождается вашей программой и затем продолжается. Из справочной страницы system

Функция system () передает аргумент команды к команде переводчик sh (1). Вызов процесс ожидает завершения оболочки выполняя команду, игнорируя SIGINT и SIGQUIT, и блокировка SIGCHLD.

0 голосов
/ 29 августа 2009

SIGSEGV - ошибка нарушения доступа, которая указывает на указатель null. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * system("exit") * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * *.

Замените system("exit") на return 1 (или любой другой код ошибки, который вы хотите), это должно исправить это.

0 голосов
/ 29 августа 2009
  1. в какой строке вы получаете сообщение об ошибке?
  2. Ваш пустой #include предназначен? я думаю, это должно означать #include
  3. есть ли у вас ошибка для каждого входа или только для 42?

1009 * привет *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...