当我来自C中的另一个函数时,没有memset工作

时间:2013-10-27 03:06:10

标签: c

当我来自success()函数时,我不需要将事物设置回0但是当我在相同函数内循环序列时,我必须设置内存使用memset(psswrd,0,sizeof(psswrd));将psswrd设置为0,那么当我来自另一个函数时,没有memset的情况有什么不同呢?


在其他用户评论我的代码之后(感谢批评,我从中学习),我使用新循环修改它,我的问题现在通过这个代码无法实现,所以我的一个新问题,就是为什么当我来自另一个函数,例如success(),我不需要将它的内存设置为0?由于声明,它会自动重新设置为默认初始化吗?

#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <string.h>
#include <process.h>

success(){
    clrscr();
    printf("Press Any Key to Go Back and Login ");
    getch();
    return 0;
}

int cnt;
void login(){
    char    ch,
    mypass[]="thepass",
    psswrd[256]={0};
    do{
        cnt=NULL;
        memset(psswrd,0,sizeof(psswrd));
        clrscr();
        printf("Enter Password: ");
        do{
            ch=getch();
            if( isprint(ch) ){
                psswrd[ cnt++ ] = ch;
                printf("%c", ch);
                }
            else
            if(ch==8 && cnt){
                psswrd[ cnt-- ] = '\0';
                printf("%s", "\b \b");
                }
            }
        while(ch!=13);
        }
    while(strcmp(psswrd,mypass));
    }

void main(){
    do{
        login();
        success();
    }
    while(!success());
    }

2 个答案:

答案 0 :(得分:1)

psswrd永远不会是空的。它是一个数组,总是具有相同的大小。在你的情况下,它总是8个大字符(你指定的7个字符加上最后自动插入的\0字符。)

要“清空”字符串意味着将其长度设置为零。在C中,惯例是字符串被认为在第一次出现\0时结束。因此,为了将长度设置为零,您只需将字符数组的第一个元素设置为0.您不需要memset()整个事情:

psswrd[0] = 0;

cnt为0(它是int时,NULL只是令人困惑),那么上面就会发生这种情况,字符串被认为是零长度因此是空的

答案 1 :(得分:0)

正如我从修改代码中学到的那样,初始化本身将变量设置为0 发生在这一行:

char    ch, mypass[]="thepass", psswrd[256]={0};

在循环我的代码时,循环没有达到初始化,同样,声明不应该在循环内,因为变量也将由while()函数使用

解决方案是使用0函数将其内存恢复为memset()