关于#字符串#的问题,如何解决?

输入两个字符串(字符串长度不超过100,回车隔开),两字符串均为小写字母,要求寻找第二个字符串中第一个字符串的一种排列(即第二个字符串是否存在一个子字符串,和第一个字符串所含元素完全相同)。

0x00007FFA5722F530 (ucrtbased.dll) (2018年秋季学期程设期末机考 卷2.exe 中)处有未经处理的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFCC 时发生访问冲突。

#include
#include
#pragma warning(disable:4996)
void judge(char a[100], char b[100])
{
    int i, j, k, m, flag=0;
    char c[100] = { '\0' }, d[100] = { '\0' };
    for (i = 0;i < strlen(b);i++)               /*第二个数组*/
    {
        for (j = 0;j < strlen(a); j++)          /*第一个数组*/
        {
            if (b[i] == a[j])
            {
                strcpy(c, a);
                strcpy(d, b);
                c[j] = 'A';
                flag++;
                for (k = j + 1;k < j + strlen(c);k++)
                {
                    for (m = 0;m < strlen(c); m++)
                    {
                        if (b[k] == c[m])
                        {
                            c[m] = 'A';
                            flag++;
                        }
                    }
                }
                if (flag == strlen(a))
                {
                    printf("True\n");
                    for (k = j;k < j + strlen(a);k++)
                        printf("%c", b[k]);
                }
                else
                    flag = 0;
            }
        }
        if (flag != strlen(a))
            printf("False\n");
    }
}
main()
{
    char a[100] = { '\0' }, b[100] = { '\0' };
    scanf("%s", a);
    scanf("%s", b);
    judge(a[100], b[100]);
    system("pause");
}



![img]https://img-mid.csdnimg.cn/release/static/image/mid/ask/056457657076176.png "#left")

遍历a,b字符串,遇到第一个相同元素时开始循环将a中的相同元素赋为A,并将计数器加1,若得到计数器的值与a的字符串长度相同,则找到题目符合条件。

如何修改错误

judge(a[100], b[100]);是传递了2给字符,改为
judge(a, b);

查找只需遍历1次就可以。


#include <stdio.h>
#include <string.h>
#pragma warning(disable : 4996)

void judge(char a[100], char b[100])
{
    int i, j, k, m, flag = 0;
    char c[100] = {'\0'}, d[100] = {'\0'};
    int lena = strlen(a);
    // for (i = 0; i < ; i++) /*第二个数组*/
    for (i = 0; b[i]; i++) /*第二个数组*/
    {
        if (b[i] == a[0]) // b中与a首字母相同开始遍历
        {
            flag = 0;
            strcpy(c, a);

            // for (j = 0; j < lena; j++) /*第一个数组*/
            for (j = 0; a[j]; j++) /*第一个数组*/
            {
                // if (b[i] == a[j])
                // {
                // strcpy(d, b);
                // c[j] = 'A';
                // flag++;
                // for (k = j + 1; c[k]; k++)
                // {
                // for (m = 0; c[m]; m++)
                // {
                if (b[i + j] == a[j]) // if (b[k] == c[m])
                {
                    c[j] = 'A';
                    flag++;
                }
                //}
                //}
                // if (flag == strlen(a))
                // {
                //     printf("True\n");
                //     for (k = j; k < j + strlen(a); k++)
                //         printf("%c", b[k]);
                // }
                // else
                //     flag = 0;
            }
            if (flag == lena)
                break; // 找到后跳出循环
        }
    }
    if (flag != lena)
        printf("False\n");
    else
    {
        printf("True\n");
        for (k = i; k < i + lena; k++)
            printf("%c", b[k]);
        printf("\n");
    }
}
int main()
{
    char a[100] = {'\0'}, b[100] = {'\0'};
    scanf("%s", a);
    scanf("%s", b);
    judge(a, b); // judge(a[100], b[100]);
    system("pause");
}