永发信息网

一段比较字符串大小的c语言代码,总是一运行就崩溃,达人帮我看看哪里的问题

答案:3  悬赏:0  手机版
解决时间 2021-11-27 00:29
一段比较字符串大小的c语言代码,总是一运行就崩溃,达人帮我看看哪里的问题
最佳答案
char* Input()中,s只是一个临时变量,它的生命期只在Input函数内,所以 p 指向s的首地址并返回后,但是当退出 Input()后,s就被释放了,
所以在main函数中,再使用s1,s2时就出现了野指针访问异常。
最简单的解决办法就是将char s[21]定义成全局的。

改好的程序:
#include
#include

char s[21]; //这里!这里!这里!这里!这里!这里!这里!这里!

char* Input();
int strcmp( char* s1 , char* s2);
void AbondonFirstChar(char* s);
int main(){
char* s1 , * s2 ;
printf("This program compares two strings.\n");
s1 = Input();
s2 = Input();
printf("%d",strcmp( s1 , s2 ));
return 0;
}
char* Input(){
char *p = s ; //这里!这里!这里!这里!这里!这里!这里!这里!
int i ;
for ( i = 0 ; i < 20 ; i ++ ){
*(p+i) = getchar() ;
if ( s[i] == '\n' || s[i] == '\0' ) break ;
}
s[i] = '\0'; //字符串赋值,字符串长度不超过20
p = s ;
return p ;
}

int strcmp( char* s1 , char* s2){

if ( *s1 == '\0' && *s2 == '\0' )
return 0 ;
if ( *s1 == '\0' || *s1 < *s2 )
return -1 ;
if ( *s2 == '\0' || *s1 > *s2 )
return 1 ;
char *p1 = s1 , *p2 = s2 ;
AbondonFirstChar( p1 ) ;
AbondonFirstChar( p2 ) ; //若两个字符串的首字母相同则去掉首字母
strcmp ( s1 , s2 ); //迭代比较
return 2 ;
}

void AbondonFirstChar(char* s){
int i , n ;
n = strlen( s );
for( i = 0; i < (n-1) ; i ++ ){
*(s+i) = *(s+i+1);
}
*(s+n-1) = '\0'; //使原本的最后一位变为结束
return ;
}追问嗯,确实,但这样改后s1,s2指向的都是s[21]了,还是不对啊,我把Input中的指针p去掉了,把s[21]改成了*s,但是不管用scanf还是getchar都不能输入,什么问题?
全部回答
不清楚
char* s1 , * s2 ;这儿只是指针,并没有分配空间,所以输入肯定会出错
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
地温白天和夜晚有何差别
中国邮政(西城邮政支局)(肇东镇十七道街北中
欧版厨师机两插头会漏电吗
戴尔7557装了两根DDR3的内存条,不知道有没有
NDS(电脑模拟)逆转裁判4 如何即时存档(游
搞个小批发部赚钱不
HD2015,HD2016和新出的PG1如果打水泥场哪款会
追尾后双方下车察看,轻微擦碰,前司机要求赔
求齐氏家谱上下:现知字辈(廷、民、香、东)
米莉衣甲馆地址有知道的么?有点事想过去!
求解.我在SU里怎么导入不了CAD图
0~9的三个数字的组合有哪些,怎么排列
纹唇第一天和以后颜色能差别多大
谁有百战天狼电视剧的全部
最近一直犯困身体没力气怎么办
推荐资讯
2018年个人所得税记录怎么查询?
思想道德包括什么
三个麻麻母婴生活馆地址在什么地方,想过去办
拳皇97 我发现河池的克星不是辉辉而是顶级大
欣玉宠物医院地址在什么地方,想过去办事,
你知道哪些鸟是候鸟吗?(至少列举3种)
网友第一次见面花二千多算正常吗
主角叫蓝天 原是天国里最厉害的 但被打下人间
尼桑逍客发动机故障码混合气组1稀薄
我爱王先博,用数字怎么说
将绳四折来量井外余1米.求井深和绳长各是多少
5/8米的4/9是多少米
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?