一段比较字符串大小的c语言代码,总是一运行就崩溃,达人帮我看看哪里的问题
答案:3 悬赏:0 手机版
解决时间 2021-11-27 00:29
- 提问者网友:呐年旧曙光
- 2021-11-26 21:11
一段比较字符串大小的c语言代码,总是一运行就崩溃,达人帮我看看哪里的问题
最佳答案
- 五星知识达人网友:思契十里
- 2021-11-26 21:29
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都不能输入,什么问题?
所以在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都不能输入,什么问题?
全部回答
- 1楼网友:空山清雨
- 2021-11-26 23:54
不清楚
- 2楼网友:舍身薄凉客
- 2021-11-26 22:49
char* s1 , * s2 ;这儿只是指针,并没有分配空间,所以输入肯定会出错
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯