为什么这个C程序不能正常工作?

时间:2018-04-01 10:15:24

标签: c

我尝试创建我的函数版本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�

2 个答案:

答案 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);

这将解决您的问题。