什么线是错误的 - 段错误,那是......?

j6m*_*6m8 1 c char segmentation-fault

我是C的新手(对于StackOverflow来说是全新的 - 嘿伙计们!),这段错误让我在过去的几个小时内没有悲伤(在Windows机器上使用DevC++).这只是一个简单的回文主要计划,但它确实让我很难过.我一般不是像这样的新手程序员,但是...好上帝.现在我记得为什么我要快速摆脱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;                                         
  }
}                                                    
Run Code Online (Sandbox Code Playgroud)

如果这是一个愚蠢的问题,我提前道歉,答案是非常明显的 - 但我已经正式达到极限,无论答案多么合乎逻辑,我一直在编写同样的问题太长时间了.有道理.此外,段错误是可怕的野兽.提前感谢您提供的任何服务!

〜乔丹

nos*_*nos 5

这条线sprintf(strI, "%s%d", 10, myInt);很可能会崩溃.

  • 您没有为其分配任何空间strI,它被定义为char* strI = 0;Make it a char[64]或合适的大小.
  • 你给sprintf提供了错误的参数,"%s%d"表示第一个参数应该是一个字符串("%s"),但你给它一个int.将%s更改为%d

其他一些问题:

  • 不要使用*p1 ^ =*p2; 黑客交换变量,有很多情况下这不起作用.使用临时变量正确执行.
  • main()调用isPrime(),但那时isPrime没有原型.将int isPrime(int myInt);之前的主某处().
  • strrev函数的原型应该是char *strrev(char str[]);和不是char *strrev()