在C中,如何存储长字符串(示例密码)

时间:2014-12-02 13:33:24

标签: c arrays string compare c-strings

好吧,我已经让这个程序检查密码了。如果我将第二个数组(即for循环)设置为8位数,它可以正常工作。但是一旦pw需要超过8位数,整个事情就会出错(因为for循环会有10位数字)。

我认为将第一个数组声明为MAXLINE long会起作用,但它似乎无法解决问题。

/* IMPORT ---------------------- */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* CONST------------------ */
#define MAXDIGIT 10000
/* VARIABLES (global) ---------- */

/* MAIN--------------- */
int main()
 {
  /* VARIABLES (local) --------- */
    /* VARIABLES (local) --------- */


  // ENTERED PW: 
  char EnterCode[MAXDIGIT];  
  int i;


  // REAL PW: 
  char arr[MAXDIGIT] = "123456789";  //"YKJ98LGDDF";
  int j;

  printf("PW: "); // for testing

  for (j = 0 ; j < 8; ++j){
     printf("%c", arr[j]);
  }

  /* Intro --------------------- */
  printf("\nPlease enter code of authorization: ");

  for(i = 0; i < 10; ++i){

      scanf("%c", &EnterCode[i]);
      printf("%c", EnterCode[i]); // test 1
  }




      if (strcmp(EnterCode,arr) == 0){
          printf("\nAccess authorized.\n");
      }else{
         printf("\nAccess denied!\n");
      }

  system("PAUSE");
  return 0;
 }

3 个答案:

答案 0 :(得分:1)

虽然您 将scanf置于循环中 ,但您没有需要在您的应用程序中执行此操作:

如果要在字符串中捕获密码,只需声明合理的长度字符串,使用它在一次调用中读取用户的输入:

char EnterCode[20];//20 is just for illustration, pick any reasonable length for your application

printf("enter your passcode:\n");
scanf("%19s", EnterCode);  //limit characters read to 19 (leaving room for terminating NULL)

对于特别长的密码
而不是在堆栈上创建内存:

#define MAXDIGIT 10000
char EnterCode[MAXDIGIT];//uses a large block of memory from a limited source  

将它放在堆上:

char *EnterCode = {0};  
EnterCode = malloc(MAXDIGIT); //also uses a large block of memory, but from a much much larger source

完成使用EnterCode后,释放内存:

free(EnterCode);

答案 1 :(得分:0)

在C语言字符串中以&#39; \ 0&#39;。

结束

因此,您的密码应为&#34; 123456789&#34;进入&#34; EnterCode&#34; 设置EnterCode [10] =&#39; \ 0&#39; (在你的代码中)。

答案 2 :(得分:0)

替换

for(i = 0; i < 10; ++i){
    scanf("%c", &EnterCode[i]);
    printf("%c", EnterCode[i]); // test 1
}

scanf("%s", EnterCode);

再试一次。