Какая линия виновата - это segfault ...? - PullRequest
1 голос
/ 05 октября 2011

Я относительно новичок в C (и совершенно новичок в StackOverflow - привет, ребята!), И этот segfault не давал мне скорбеть последние несколько часов (DevC ++ на Windows-машине).Это просто простая палиндромная программа, но она действительно доставляет мне трудности.Я обычно не начинающий программист, как кажется здесь, но ... Боже мой.Теперь я помню, почему я так быстро хотел уйти от C ++ и Python.

#include <stdio.h>                                           
#include <stdlib.h>                                          
#include <errno.h>                                           
#include <string.h>                                         

FILE *outputFile;                                           
char buffer[81];
char* strrev();                                            
int bytesWritten;                                           
char* strI = 0;   


char *strrev(char str[])
{
   char *p1 =NULL;
   char *p2 =NULL;  

  if (! str || ! *str)
        return str;
  for (p1 = str, p2 = str + strlen(str) - 1; p2 > p1; ++p1, --p2)
  {
        *p1 ^= *p2;
        *p2 ^= *p1;
        *p1 ^= *p2;
  }
  return str;
}

main()                                                       
{ 
    int isPrime(int);

    int i,j;                                                                     
    outputFile = fopen("DD:OUTPUT", "w");                       
    if (outputFile == NULL)                                     
    {                                                           
       printf("open error:   %d/%s\n", errno, strerror(errno));   
       exit(99);                                                  
    }                                                                                                                          
for (i=1; i<15000; i++)                                  
{   

if (isPrime(i)==1)                                    
{                                                      
 bytesWritten = sprintf(buffer,"%d is primepal!\n",i);    
 fwrite(buffer, 1, bytesWritten, outputFile);          
}                                                      
}                                                                         
fclose(outputFile);                                       

return 0;                                                
}    

int isPrime(int myInt)                              
{                                                    

int loop;                                           

for (loop = 2; loop < myInt/2+1; loop++)
  sprintf(strI, "%s%d", 10, myInt);           
  {                                                   
      if (myInt%loop==0 && (atoi(strrev(strI))-myInt)==0)
      {                              
      return 0;                                       
  }                                                   
  return 1;                                         
  }
}                                                    

Я заранее прошу прощения, если это глупый вопрос, и ответ очень очевиден - но яофициально достиг предела, где, как бы логично ни был ответ, я слишком долго кодировал одну и ту же проблему, чтобы она имела какой-либо смысл.А также, сегфолты - это ужасные звери.Заранее спасибо за все, что вы можете предложить!

~ Иордания

Ответы [ 3 ]

5 голосов
/ 05 октября 2011

Линия sprintf(strI, "%s%d", 10, myInt);, вероятно, дает сбой.

  • Вы не выделили пространство для strI, оно определено как char* strI = 0; Сделайте его char[64] или подходящим размером.
  • Вы даете неправильные аргументы sprintf, "% s% d" говорит, что первый параметр должен быть строкой ("% s"), но вы даете ему int. Изменить% s на% d

Некоторые другие проблемы:

  • Не используйте * p1 ^ = * p2; Как поменять местами переменные, есть много случаев, когда это не работает. Сделайте это правильно с временной переменной.
  • main () вызывает isPrime (), но в то время нет прототипа для isPrime. Поместите int isPrime(int myInt); где-нибудь перед main ().
  • Прототип для вашей функции strrev должен быть char *strrev(char str[]);, а не char *strrev()
3 голосов
/ 05 октября 2011

Сегфаулты не должны быть такими плохими, как вы. Скомпилируйте программу с отладочными символами (добавьте -g в gcc) и запустите ее в gdb. После segfault введите bt в gdb и нажмите ввод. Он скажет вам точную линию вашего сегфо.

0 голосов
/ 05 октября 2011
for (loop = 2; loop < myInt/2+1; loop++)
  sprintf(strI, "%s%d", 10, myInt);           
  {
    if (myInt%loop==0 && (atoi(strrev(strI))-myInt)==0)

Возможно, вы захотите перепроверить, где у вас есть эта фигурная скобка по отношению к for.Это не питон, и отступы сами по себе его не делают.

...