将字符串文字从一个函数返回到另一个

时间:2019-01-12 14:45:36

标签: c string

我真的很努力地想出如何将字符串从一个函数返回给其他函数。请帮我解决这个问题。

通过此函数以字符串形式返回密码:

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());
}

2 个答案:

答案 0 :(得分:1)

由于char password[maxPassword+1];的生存期是在函数完成从ram的自动删除之后的password函数中。

在函数内部定义的,未声明为静态的变量是自动的。有一个关键字可以明确声明这样的变量– auto –但几乎从未使用过。自动变量(和函数参数)通常存储在堆栈中。通常使用链接器定位堆栈。动态存储区的末端通常用于堆栈。

要解决此问题,您可以选择

  1. 您可以从密码函数的参数中获取此变量,然后进行更改。

    void password(char password*)

  2. 具有malloc

    的C动态内存分配

    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毫无帮助。