2014-10-09 120 views
-1

所以我知道编程的基础,我有一个体面的数量与java的经验,但即时学习C的学校现在。我仍然没有完全理解整个指针方面,这是我确定导致错误的原因。这个程序在我的电脑上运行时工作正常,但是当我尝试在我的学校unix shell上运行它时,它给我一个seg故障。如果有人可以请向我解释为什么或如何滥用指针,这对我很有帮助。seg故障/指针帮助

//Matthew Gerton 
//CS 222 - 002 
//10/10/14 
//HW Six 

//libraries 
#include<stdio.h> 
#include<string.h> 
#define max_Length 256 

//prototypes 
void decode(char *a, char *b); 
void trimWhite(char *a); 
void encode(char *a, char *b); 

int main(void) 
{ 
    //character arrays 
    char coded[max_Length], decoded[max_Length]; 

    //decode the sample phrase 
    char sample[] = {'P','H','H','W','D','W','C','R','R','F','D','Q','F','H','O','H','G','J', 
       'R','W','R','P','H','W','U','R','K','R','W','H','O','U','R','R','P','I','R','X','U'}; 

    decode(sample, decoded); 

    //scans a user input string to decode, and decodes it 
    printf("\nPlease enter a phrase to decode: "); 
    gets(coded); 
    trimWhite(coded); 
    decode(coded, decoded); 

    //scans a user input phrase to encode 
    printf("\nPlease enter a phrase to encode: "); 
    gets(coded); 
    trimWhite(coded); 
    encode(coded, decoded); 
} 

//removes any spaces from the input 
void trimWhite(char *a) 
{ 
    char temp[max_Length]; 
    int z=0, y=0; 
    while(a[z]!='\0') 
    { 
     if(a[z]!=' ') 
     { 
      temp[y]=a[z]; 
      y++; 
     } 
     z++; 
    } 
    temp[y] = '\0'; 
    strcpy(a,temp); 
    } 

//decodes any phrase 
void decode(char *a, char *b) 
{ 
    int i=0,n; 
    memset(b, '\0', sizeof(b)); 
    while(a[i]!='\0') 
    { 
     n=(int)a[i]; 
     if(n<97) 
      n=n+32; 
     if(n<=99) 
      n=n+23; 
     else 
      n = n-3; 
     b[i]= (char) n; 
     i++; 
    } 
    b[i]='\0'; 
    printf("Coded message: %s\n", a); 
    printf("Decoded message: %s\n", b); 
} 
//codes an input phrase 
void encode(char *a, char *b) 
{ 
    int i=0,n; 
    memset(b, '\0', sizeof(b)); 
    strcpy(b,a); 
    while(a[i]!='\0') 
    { 
     n=(int)a[i]; 
     if(n<97) 
      a[i] = (char)(n+32); 
     if((n>120) 
      a[i] = (char)(n-23); 
     else 
      a[i] = (char)((n+3); 

     i++; 
    } 
    printf("Coded message: %s\n", a); 
} 

回答

0
  • 你的主要问题是在这里:

    char sample[] = {'P','H','H', /* snip */ ,'R','X','U'}; 
    

    sample[]阵列不是零封端的并因此可能导致decode()功能来复制许多更多的字符比预期,从而覆盖其他变量。你需要明确添加终结零使用初始化列表时:

    char sample[] = {'P','H','H', /* ... */ ,'R','X','U',0};

    或者你也可以使用一个字符串,其中包括初始化数组终止零:

    char sample[] = "PHHWDWCRRFDQFHOHGJRWRPHWURKRWHOURRPIRXU"; 
    
  • 您应该阅读"Why is the gets function dangerous"

  • ...

    void decode(char *a, char *b) 
    { 
        int i=0,n; 
        memset(b, '\0', sizeof(b)); 
    

    还要注意,当它传递给函数的数组的大小都将丢失。该函数只收到一个指向其第一个元素的指针。上面的调用memset()只会为零sizeof(char*)字节(通常为4或8)。这并不重要,因为,就我所知,只需要将第一个字节清零。你可以简单地写:

    b[0] = 0;