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