代pf 2024-06-02 11:04 采纳率: 14.3%
浏览 4

函数中字符串越界,但没找到哪越界

问题在函数中if(s[i]>='A'&&s[i]<='Z')出现报错,字符串越界,但我检查后没找到越界问题


#include <stdio.h>
#include <string.h>
#define N 100
int Judge(char s[N],int n);
int main()
{
    char a[N];
    int n, num;
    printf("Please input the password!\n");
    gets(a);
    n = strlen(a);
    num = Judge(a, n);
    if(num == 1)
    {
        printf("%d Best", n);
    }
    else if(num == 2)
    {
        printf("%d Strong", n);
    }
    else if(num == 3)
    {
        printf("%d Medium", n);
    }
    else if(num == 4)
    {
        printf("%d Weak", n);
    }
    
    return 0;
    
    
}
int Judge(char s[N],int n)
{
    int i, num = 0, judge = 0;
    int a = 0, b = 0, c = 0, d = 0;
    char e[N], f[N], g[N], h[N];
    for(i = 0; i < n-1; i++)
    {
        if(s[i] >='A'&&s[i] <='Z')
        {
            e[a] == s[i];
            a++;
        }
        else if(s[i] >='a')
        {
            f[b] = s[i];
            b++;
        }
        else if(s[i] >='0'&&s[i] <='9')
        {
            g[c] = s[i];
            c++;
        }
        else if(s[i] =='@'||s[i] =='-'||s[i] =='_'||s[i] == '#'||s[i] =='~')
        {
            h[d] = s[i];
            d++;
        }
    }
    if(a > 0)
    {
        num++;
    }
    if(b > 0)
    {
        num++;
    }
    if(c > 0)
    {
        num++;
    }
    if(d > 0)
    {
        num++;
    }
    if(num = 4&&n >= 16&&a > 1&&b > 1&&c > 1&&d > 1)
    {
        for(i = 0; i < a-1; i++)
        {
            if(e[i+1] == e[i])
            {
                judge++;
                break;
            }
            
        }
        for(i = 0; i < c-1; i++)
        {
            if(f[i+1] == f[i])
            {
                judge++;
                break;
            }
            
        }
        for(i = 0; i < c-1; i++)
        {
            if(g[i+1] == g[i])
            {
                judge++;
                break;
            }
            
        }
        for(i = 0; i < d-1; i++)
        {
            if(h[i+1] == h[i])
            {
                judge++;
                break;
            }
            
        }
        if(judge == 4)
        {
            return 1;
        }
    }
    else if(n >= 10&&num == 4&&!(a > 1&&b > 1&&c > 1&&d > 1))
    {
        return 2;
    }
    else if(n >= 8&&num >= 3)
    {
        return 3;
    }
    else 
    {
        return 4;
    }
}








  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-06-02 11:07
    关注

    引自免费微信小程序:皆我百晓生

    经过分析您的代码,我发现问题出在以下两处:

    1. 在这里:

      e[a] == s[i];
      

      应该是赋值操作,而不是比较操作,应改为:

      e[a] = s[i];
      
    2. 您在计算子串长度时,可能会导致数组越界。例如,在这里:

      for(i = 0; i < a-1; i++)
      

      a == 0时,循环条件也会执行,导致对e[0]的访问。为了避免这种情况,您需要在开始这些循环之前检查计数器是否大于0。

    修改后的代码如下:

    #include <stdio.h>
    #include <string.h>
    #define N 100
    int Judge(char s[N],int n);
    int main()
    {
        char a[N];
        int n, num;
        printf("Please input the password!\n");
        fgets(a, N, stdin); // 使用fgets替代gets,以防止缓冲区溢出
        a[strlen(a) - 1] = '\0'; // 去掉fgets读取的换行符
        n = strlen(a);
        num = Judge(a, n);
        if(num == 1)
        {
            printf("%d Best", n);
        }
        else if(num == 2)
        {
            printf("%d Strong", n);
        }
        else if(num == 3)
        {
            printf("%d Medium", n);
        }
        else if(num == 4)
        {
            printf("%d Weak", n);
        }
    
        return 0;
    }
    
    int Judge(char s[N],int n)
    {
        int i, num = 0, judge = 0;
        int a = 0, b = 0, c = 0, d = 0;
        char e[N], f[N], g[N], h[N];
    
        for(i = 0; i < n; i++) // 将n-1更改为n,以便包含最后一个字符
        {
            if(s[i] >='A' && s[i] <= 'Z')
            {
                e[a] = s[i]; // 修改为赋值操作
                a++;
            }
            else if(s[i] >='a' && s[i] <= 'z')
            {
                f[b] = s[i];
                b++;
            }
            else if(s[i] >='0' && s[i] <= '9')
            {
                g[c] = s[i];
                c++;
            }
            else if(s[i] == '@' || s[i] == '-' || s[i] == '_' || s[i] == '#' || s[i] == '~')
            {
                h[d] = s[i];
                d++;
            }
        }
    
        if(a > 0)
        {
            num++;
        }
        if(b > 0)
        {
            num++;
        }
        if(c > 0)
        {
            num++;
        }
        if(d > 0)
        {
            num++;
        }
    
        if(num == 4 && n >= 16 && a > 1 && b > 1 && c > 1 && d > 1)
        {
            for(i = 0; i < a; i++) // 在循环条件中检查a是否大于0
            {
                if(e[i+1] == e[i])
                {
                    judge++;
                    break;
                }
            }
            for(i = 0; i < b; i++)
            {
                if(f[i+1] == f[i])
                {
                    judge++;
                    break;
                }
            }
            for(i = 0; i < c; i++)
            {
                if(g[i+1] == g[i])
                {
                    judge++;
                    break;
                }
            }
            for(i = 0; i < d; i++)
            {
                if(h[i+1] == h[i])
                {
                    judge++;
                    break;
                }
            }
            if(judge == 4)
            {
                return 1;
            }
        }
        else if(n >= 10 && num == 4 && !(a > 1 && b > 1 && c > 1 && d > 1))
        {
            return 2;
        }
        else if(n >= 8 && num >= 3)
        {
            return 3;
        }
        else 
        {
            return 4;
        }
    }
    

    这样应该可以解决字符串越界的问题,并且使程序正常运行。记得输入密码时不要超过100个字符,以防超出数组边界。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月2日