我有这段代码:
char* receiveInput(){
char *s;
scanf("%s",s);
return s;
}
int main()
{
char *str = receiveInput();
int length = strlen(str);
printf("Your string is %s, length is %d\n", str, length);
return 0;
}
我收到了这个输出:
Your string is hellàÿ", length is 11
我的意见是:
helloworld!
有人可以解释为什么,以及为什么这种编码风格很糟糕,提前谢谢
答案 0 :(得分:20)
答案 1 :(得分:11)
scanf
不为您分配内存。
您需要为传递给scanf
的变量分配内存。
你可以这样做:
char* receiveInput(){
char *s = (char*) malloc( 100 );
scanf("%s",s);
return s;
}
但警告:
调用receiveInput
的函数将获取返回内存的所有权:在free(str)
中打印后,您必须main
。 (以这种方式取消所有权通常不被视为一种好的做法)。
一个简单的解决方法是将分配的内存作为参数。
如果输入字符串长于99
(在我的情况下),程序将遭受缓冲区溢出(这就是它已经发生的事情)。
一个简单的解决方法是将缓冲区的长度传递给scanf
:
scanf("%99s",s);
固定代码可能是这样的:
// s must be of at least 100 chars!!!
char* receiveInput( char *s ){
scanf("%99s",s);
return s;
}
int main()
{
char str[100];
receiveInput( str );
int length = strlen(str);
printf("Your string is %s, length is %d\n", str, length);
return 0;
}
答案 2 :(得分:2)
您必须首先在receiveInput()方法中为您的s对象分配内存。如:
s = (char *)calloc(50, sizeof(char));