我无法在这个简单的代码中找到错误

时间:2017-06-09 15:17:49

标签: c debugging

我昨天刚开始学习C,我被要求将这个小程序写成培训,它测量密码是否足够强

int main()
{
    char password[20];
    int spec, upper, i;
    printf("Please enter a password between 6 to 20 characters:\n");
    scanf(" %c", &password);

    for(i=0, i<=20 , i++){
        if(isupper([i])){
                upper+=1;
                }else{
                    if(isdigit([i])){
                            upper+=1;
                    }
                        else{
                            spec++;
                        }
        }
        if((spec+upper)>2){
            printf("Secure password");
            }else{
            printf("Please change your password");
            }
    return 0;
}

6 个答案:

答案 0 :(得分:1)

你的一些条件不好,它不是[i]而是密码[i],在scanf中它是%s而不是%c,没有&amp ;. 有一个}缺失,spec和upper没有初始化。

一个例子:

#include <stdio.h>
#include <ctype.h>

int main()
{
char password[20];
int spec = 0;
int upper = 0;
int i;
printf("Please enter a password between 6 to 20 characters:\n");
scanf(" %s", password);

for(i=0; i<20 ; i++){
    if(isupper(password[i])){
            upper++;
    }else if(isdigit(password[i])){
                        spec++;
    }
}
    if(spec > 0 && upper > 0){
        printf("Secure password");
        }else{
        printf("Please change your password");
        }
return 0;
}

答案 1 :(得分:0)

specupper变量初始化为0。

作为int spec=0, upper=0;

并由 Haris 评论: 使用%s代替%c

答案 2 :(得分:0)

你需要在任何地方写密码[i]而不是[i]。

答案 3 :(得分:0)

让我们列举这段代码的所有问题:

  • 没有数组变量的数组索引:您必须编写password[i]来访问i的{​​{1}}元素。
  • 访问数组越界,这是未定义的行为password将循环使用最终值for(i=0, i<=20 , i++)并且当您的数组时有20个元素,最后一个有效索引是20
  • 错误使用19scanf()转换说明符用于转换一个字符。您可以使用例如c表示最多20个字符的单词或"%20s"也可以使用空格和制表符。更简单的方法是使用"%20[^\n]"来读取输入的
  • 如果您想要20个字符的密码,fgets()变量是一个变小。 password终结符需要一个额外的字符来标记字符串的结尾。 (对于'\0',它将再次需要一个字符,因为fgets()也会在一行的末尾读取换行符。)
  • 逻辑存在缺陷:无论用户输入了多少个字符,您都会检查所有20个字符,其中一些是未初始化的(这是未定义的行为,顺便说一句)所以你永远不会得到理想的结果。

更正后的版本可能如下所示:

fgets()

答案 4 :(得分:0)

scanf(" %c", &password);只会将1个字符读入password[]

代码可以尝试

char password[20];
printf("Please enter a password between 6 to 20 characters:\n");
fflush(stdout);
scanf("%19s", &password);

然而,这也存在问题。

  1. 是否未读取用户输入的

  2. 密码中的空格不会保存在password[]

  3. 数组需要大1才能接受20个字符。

  4. 高级问题:使用隐藏缓冲区的代码读取密码会在内存中留下密码副本。安全系统使用特殊的输入函数来擦除缓冲区内容以避免这种情况。因此,使用"%c"读取1个字符对于"%s"调用的缓冲区来说是一个好主意。下面使用fgetc()来最小化难以擦除的函数缓冲区。

  5. #include <ctype.h>
    #include <stdio.h>
    #define PW_MIN 6
    #define PW_MAX 20
    
    int main() {
      // allow for 1 extra character to be read and null character
      char password[PW_MAX + 1 + 1];
    
      unsigned length = 0;
      unsigned upper_digit = 0;  // Initialize these to 0
      unsigned spec = 0;
      int ch;
    
      printf("Please enter a password between %d to %d characters:\n", PW_MIN, PW_MAX);
      fflush(stdout);
      while ((ch = fgetc(stdin)) != '\n' && ch != EOF) {
        if (length + 1 < sizeof password) {
          if (isupper(ch)) upper_digit++;
          else if (isdigit(ch)) upper_digit++;
          else spec++;
          password[length++] = ch;
        }
      }
    
      if (length >= PW_MIN && length <= PW_MAX && (spec + upper_digit) > 2) {
        puts("Secure password");
        // use password somehow
      } else {
        puts("Please change your password");
      }
    
      // scrub data.
      memset(password, 0, sizeof password);
      length = upper_digit = spec = 0;
      ch = 0;
      return 0;
    }
    

    我怀疑OP的(spec + upper_digit) > 2测试是错误的,但现在仍然是这样。

答案 5 :(得分:0)

这是解决方案的人:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <math.h>

int main()
{
char password[20];
int spec=0, upper=0, digit=0,test=0,pwdlength=0;
int i;
printf("Please enter a password between 6 to 20 characters:\n");
while(test!=1){
        scanf(" %s", password);
        pwdlength = strlen(password);
        while((pwdlength<6) || (pwdlength>20)){
            printf("Please enter a password with a length between 6 and 20 chars:");
            scanf(" %s", password);
            pwdlength = strlen(password);
        }
        for(i=0; i<=pwdlength ; ++i){
            if(isupper(password[i])){
                upper++;
            }else if(isdigit(password[i])){
                digit++;
            }else if(isalpha(password[i])){
                continue;
            }else{
                spec++;
            }
        }
        if((spec+upper+digit)>=3){
            printf("Your password is strong enough \n");
            printf("Password length is: %d", pwdlength);
            test=1;
        }else{
        printf("Please type a new password:");
        }
    }

    return 0;
}