2011-10-04 133 views
1

我对C相对比较陌生(并且对于StackOverflow来说是全新的 - 嗨,伙计们!),并且这段错误在过去的几个小时里(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;           
    } 
}              

我道歉提前如果这是一个愚蠢的问题,答案是很明显的 - 但我已经正式登陆。不管答案如何合乎逻辑的,我已经编码相同的限制问题太长以至于没有任何意义。此外,segfaults是可怕的野兽。提前谢谢你提供的任何东西!

〜约旦

+2

有一个名为Valgrind的Linux程序,可以准确地告诉你段错误发生的位置。有一个[关于Valgrind替代Windows的问题](http://stackoverflow.com/questions/413477/is-there-a-good-valgrind-substitute-for-windows)。 –

+0

啊,我其实就是在几秒钟之前的那个问题 - 肯定会下载(然后祈祷我再也不用它了)。感谢您的参考! – j6m8

+1

您可能需要再次使用它,但只要运行'valgrind myprogram'并且它不会打印出您的程序出了什么问题。它甚至会在某些情况下告诉你内存泄漏的行号。 –

回答

5

sprintf(strI, "%s%d", 10, myInt);可能会崩溃。

  • 您还没有分配给strI任何空间,它定义为char* strI = 0;使它成为一个char[64],或合适的尺寸。
  • 你给sprintf提供了一个错误的参数,“%s%d”表示第一个参数应该是一个字符串(“%s”),但是你给它一个int。更改%s到%d

其他一些问题:

  • 不要使用*^P1 = * P2;篡改交换变量,有很多情况下这是行不通的。使用临时变量正确执行此操作。
  • main()调用isPrime(),但当时没有isPrime的原型。在main()之前的某处放置int isPrime(int myInt);
  • 原型为您strrev功能应该是char *strrev(char str[]);而不是char *strrev()
+0

有没有办法通过interwebsmachine拥抱人们?谢谢你这么好,我无法用语言向你表达我多么感谢你的帮助! – j6m8

+0

更好的是,在'main'之前和'strrev'之后定义'isPrime'。 –

+1

@ j6m8:有很多简单的方法来感谢SO:接受最好的答案,并提出所有你认为有帮助的答案 –

3

Segfaults不一定像您遇到的那样糟糕。使用调试符号编译程序(将-g添加到gcc)并在gdb中运行它。在segfault之后,在gdb中输入bt并按回车。它会告诉你segfault的确切路线。

+0

我使用的是DevC++,所以我没有得到任何命令行的交互,直到你提出这个问题 - 但我试过了,瞧! 63行,谢谢! – j6m8

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

你可能想仔细检查,你就有了相对于for是梅开二度。这不是python,缩进本身并不能削减它。

+0

哦哇 - 应该看到,即将到来!我甚至不得不在排队后删除我的冒号,并添加了无数被遗忘的分号。我觉得我是CS课程介绍的新生。谢谢! – j6m8