-2

当我来自success()函数时,我不需要重新设置,0但是当我在同一个函数中循环序列时,我必须使用它的大小将 psswrd 的内存设置回 0memset(psswrd,0,sizeof(psswrd));那么它有什么区别当我来自另一个函数时,没有 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());
    }
4

2 回答 2

1

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

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

psswrd[0] = 0;

什么时候cnt是 0 (它是一个int,所以NULL只是令人困惑),那么上面就是发生的事情,字符串被认为是零长度,因此是空的。

于 2013-10-27T03:16:12.910 回答
0

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

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

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

解决方案是将其内存设置回0使用memset()函数。

于 2013-10-27T14:29:05.470 回答