2017-04-17 105 views
-3

当我尝试编译这个时,我总是收到分段错误。我是否需要检查偶数和奇数?我知道这意味着我试图获得我没有的记忆,但我不知道我犯了什么错误。这也是C。保持分段错误(核心转储)

#include<stdio.h> 

int main() 
{ 
    char str[41], even[21], odd[21], *p, *pstr, *e, *o; 

    printf("Enter a string (40 characters maximum):"); 
    scanf("%s", str); 

    *p=str[0]; 
    *pstr=str[0]; 

    for(*p=even[0]; *p != '\0';p++){ 
     if((p-pstr) % 2 == 0){ 
      *e=*p; 
      e++; 
     } else{ 
      *o=*p; 
      o++; 
     } 
    } 

    *o = '\0'; 
    *e = '\0'; 

    printf("The even string is:%s", even); 
    printf("The odd string is:%s", odd);     

    return 0; 
} 
+2

'* p = str [0 ]。 * pstr = str [0];'使用未初始化的变量。 – BLUEPIXY

+2

当你这样做时,你认为'p'指向了什么:'* p = str [0]'? – WhozCraig

回答

2

有关于指针在代码中初始化一些困惑:

  • *p = str[0]副本从str的地址由p,这是未初始化指出的第一个字符,从而导致不确定的行为。
  • 应的p的值,而不是初始化的str[0]地址:

    p = &str[0]; 
    

    可以简化为

    p = str; 
    

这里是一个修正版本:

#include <stdio.h> 

int main(void) { 
    char str[41], even[21], odd[21], *p, *pstr, *e, *o; 

    printf("Enter a string (40 characters maximum):"); 
    if (scanf("%40s", str) == 1) { 
     e = even; 
     o = odd; 

     for (p = pstr = str; *p != '\0'; p++) { 
      if ((p - pstr) % 2 == 0) { 
       *e = *p; 
       e++; 
      } else { 
       *o = *p; 
       o++; 
      } 
     } 

     *o = '\0'; 
     *e = '\0'; 

     printf("The even string is: %s\n", even); 
     printf("The odd string is: %s\n", odd);     
    }  
    return 0; 
} 
+0

非常感谢,现在对我有意义:) – billnye852

1

p具有没有分配的内存,你可以设置p = strstr[0]不可复制的字符到一个随机的内存地址,因为p从未被分配一些内存它指向的。