在C中返回一个Char数组

时间:2018-03-06 21:51:14

标签: c

我正在构建一个密码程序,但我无法弄清楚如何返回一个char []数组 我的密码方法

char *cipherinput(int ciphercount){
int i=0;
char *cipher[MAX_CIPHER_SIZE];


if(ciphercount>=2){
    printf("Enter the Cipher!\n");
    //loop through and add
    for(i=0;i<ciphercount;i++){
        scanf(" %c", cipher[i]);
    }
}

   return cipher;
}

我的主要方法有

#define MAX_CIPHER_SIZE 16
#define MAX_TEXT_SIZE 256
int main()
{
   int ciphercount=0, textcount=0,i=0,j=0,k=0;
   int *cipher_, *text_, N=0,N_;

   printf("Enter size of Cipher!\n");
   scanf("%d", &ciphercount);

   if(ciphercount>=2){
    cipher_ = cipherinput(ciphercount);
   }
   else{
     printf("Start again / Cipher size should be greater or equal to 2\n");
     main();
   }
   return 0;
 }

我尝试了几种方法,例如char **(字符串)但没有成功。

3 个答案:

答案 0 :(得分:3)

您正在返回指向堆栈内存的指针,这是未定义的行为。很可能你的返回字符串在函数返回后或调用另一个函数后不久就会被破坏。

这更接近你想要的东西:

char* cipherinput(int ciphercount) {
    int i=0;
    char cipher[MAX_CIPHER_SIZE+1]; // +1 to guarantee null termination.
    cipher[0] = '\0';

    if(ciphercount>=2){
        printf("Enter the Cipher!\n");
        //loop through and add
        for(i=0;i<ciphercount;i++){
            scanf(" %c", cipher[i]);
        }
        cipher[ciphercount] = '\0'; // null terminate
    }

    return strdup(cipher);   // this is the same as ptr=malloc(strlen(cipher+1)) followed by strcpy(ptr,cipher)
}

该函数返回用户输入的字符串的副本。此函数的调用者应该在返回的指针完成后调用free。如果ciphercount < 2,该函数将返回一个空字符串。

答案 1 :(得分:1)

如果您想在功能之外使用char *cipher

char *cipherinput(int ciphercount){
     int i=0;
     char *cipher[MAX_CIPHER_SIZE];
     //...
     return *cipher;
}

您需要为密码缓冲区分配内存。 cipher[MAX_CIPHER_SIZE]函数返回后,cipherinput将不存在。这是最常见的方法:

 char* cipherinput(int ciphercount) {
        // ...
        char *cipher = malloc( sizeof(char) * (MAX_CIPHER_SIZE+1) ); // +1 to guarantee null termination.

        //...
        return cipher;
    }

这种方法要求您记住在不需要时释放为cipher分配的内存。

在嵌入式系统中,您可能希望避免内存分配,因为分配和释放可能无法及时运行。 在这种情况下,最好的方法是将缓冲区传递给您的函数:

char cipher[MAX_CIPHER_SIZE+1];    // buffer outside the function
cipherinput(ciphercount, cipher);  // function call

功能实现:

void cipherinput(int ciphercount, char * cipher){
 // access elements of cipher buffer via cipher[i]);
 // ...
}

答案 2 :(得分:0)

正常方式1,分配结果并将其返回

    char *cipherinput(int ciphercount){
      char *cipher = malloc(MAX_CIPHER_SIZE);
...
      return cipher;
    }

请注意,您的来电者必须free结果

正常方式2,调用者创建并传递结果缓冲区

void cipherinput(int ciphercount, char * cipher){
 ....
}

来电者

    char cipher[MAX_CIPHER_SIZE];
    cipherinput(x, cipher);

正常方式#3。在功能上有固定的静态缓冲区。注意这不是租用或线程安全的。

char *cipherinput(int ciphercount){
  static char cipher[MAX_CIPHER_SIZE];
  .....
  return cipher;
}

一般来说,#2可能是最好的,因为你不太可能泄漏