我真的很努力地想出如何将字符串从一个函数返回给其他函数。请帮我解决这个问题。
通过此函数以字符串形式返回密码:
char* password(void) {
const maxPassword = 15;
char password[maxPassword + 1];
int charPos = 0;
char ch;
printf(
"\n\n\n\tPassword(max 15 Characters/no numeric value or special char is allowed):\t");
while (1) {
ch = getch();
if (ch == 13) // Pressing ENTER
break;
else if (ch == 32 || ch == 9) //Pressing SPACE OR TAB
continue;
else if (ch == 8) { //Pressing BACKSPACE
if (charPos > 0) {
charPos--;
password[charPos] = '\0';
printf("\b \b");
}
} else {
if (charPos < maxPassword) {
password[charPos] = ch;
charPos++;
printf("*");
} else {
printf(
"You have entered more than 15 Characters First %d character will be considered",
maxPassword);
break;
}
}
} //while block ends here
password[charPos] = '\0';
return password;
}
此功能(但不打印):
void newuser(void) {
int i;
FILE *sname, *sid;
struct newuser u1;
sname = fopen("susername.txt", "w");
if (sname == NULL) {
printf("ERROR! TRY AGAIN");
exit(0);
}
printf("\n\n\n\tYourName:(Eg.Manas)\t"); //user name input program starts here
scanf("%s", &u1.UserName);
for (i = 0; i < strlen(u1.UserName); i++)
putc(u1.UserName[i], sname);
fclose(sname);
//sid=fopen("sid.txt","w");
printf("\n\n\n\tUserId:(Eg.54321)\t"); //User Id input starts here
scanf("%d", &u1.UserId);
printf("%s", password());
}
答案 0 :(得分:1)
由于char password[maxPassword+1];
的生存期是在函数完成从ram的自动删除之后的password
函数中。
在函数内部定义的,未声明为静态的变量是自动的。有一个关键字可以明确声明这样的变量– auto –但几乎从未使用过。自动变量(和函数参数)通常存储在堆栈中。通常使用链接器定位堆栈。动态存储区的末端通常用于堆栈。
要解决此问题,您可以选择
您可以从密码函数的参数中获取此变量,然后进行更改。
void password(char password*)
具有malloc
char *password = malloc(maxPassword+1)
如果将此方法与printf("%s", password());
一起使用,则会丢失指向分配的内存的指针,从而有意泄漏内存。可以说泄漏是在指针'a'超出范围时发生的,即当function_which_allocates()返回而没有释放'a'时。
您应该使用free()
来取消分配内存。
char* passwd = password();
printf("%s", passwd);
free(passwd);
passwd = NULL;
答案 1 :(得分:0)
char password[maxPassword+1]
是该函数的本地变量,您需要像char *password = malloc(maxPassword+1)
那样为其分配内存或使用全局变量。
还将const maxPassword=15
更改为int maxPassword=15
,并将ch=getch()
更改为ch=getchar()
。
通常,我建议您读一本有关C的书,因为似乎您在猜测,而且它对C毫无帮助。