当我来自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());
}
答案 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()
。