继续获得分段错误(核心转储)

时间:2017-04-17 22:26:53

标签: c string

当我尝试编译时,我一直在分段错误。我是否需要检查偶数和奇数?我知道这意味着我试图获得我没有的记忆,但我不知道我犯了哪个错误。这也是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 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

p没有已分配的内存,您可以设置p = str但不能将str[0]中的字符复制到随机存储器地址,因为p从未在其指向的位置分配一些内存。