我尝试创建我的函数版本gets()
和puts()
以了解它们。我正确编写的程序显示字符串,但也显示一些垃圾字符。
为什么会这样?
/* xgets and xputs function */
/*Author : Swapnil Jain */
#include<stdio.h>
void xgets(char *);
void xputs(char *);
int main()
{
char str[25];
xgets(str);
printf("\n");
xputs(str);
return 0;
}
void xgets(char *a)
{
printf("Enter string\n");
while(1)
{
scanf("%c",a);
if(*a != '\n')
a++;
else
break;
}
a = '\0';
}
void xputs(char *a)
{
while(1)
{
printf("%c",*a);
if(*a != '\0')
a++;
else
break;
}
}
输入字符串:
Hello how are you
输出字符串:
Hello how are you
D�
答案 0 :(得分:5)
你快到了。这似乎是尝试null终止输入,只有xgets()
末尾的这个特定表达式没有效果
a = '\0';
它将a
指针本身的值设置为0。
只需在*
前添加a
即可将a
指向的字符设置为0:
*a = '\0';
⚠注意:您的代码容易受到缓冲区溢出的影响,因为str
的固定长度为25,未在xgets
中检查。你应该将str
的长度作为第二个参数传递给xgets
并在那里检查。
答案 1 :(得分:1)
最好始终使用null字符初始化char数组的所有位置,该字符等于下面的0行。
.run(function($window){
$rootScope.$on("$stateChangeStart", function(event, toState, toParams, fromState, fromParams){
var userLoggedIn = $window.localStorage.getItem('loggedIn');
//user logged in and came to login then redirecting to dashboard
if(toState.name == 'login' && userLoggedIn == true){
event.preventDefault();
$state.go('dashboard');
return false;
}
//user logged out and taking user to login page (only current page is not login)
if(userLoggedIn == false && toState.name != 'login'){
event.preventDefault();
$state.go('login');
return false;
}
});
同样更正下面的代码行: -
char str[25];
memset(str, 0, sizeof(str);
这将解决您的问题。