为何还有多处答案错误,找不到解决方法

题目要求:

img


示例:

img

img

img


我的代码:

#include<stdio.h>
#include<string.h>
int main()
{
    char a[100];
    char m[100];
    int len = 0, i;
    gets(m);
    while (1)
    {
        for (i = 0; i < strlen(m); i++)
        {
            if (m[i] == '/' && m[i + 1] == '*' && (i + 1) < strlen(m))
            {
                a[++len] = '/';
                a[++len] = '*';
                i++;
            }
            else if (m[i] == '(' || m[i] == '[' || m[i] == '{')
            {
                a[++len] = m[i];
            }
            else if (m[i] == '*' && m[i + 1] == '/' && (i + 1) < strlen(m))
            {
                i++;
                if (a[len] = '*' && a[len - 1] == '/' && len != 0)
                    len = len - 2;
                else
                {
                    printf("NO\n");
                    if (len == 0)
                        printf("?-*/\n");
                    else
                        printf("%c-?\n", a[len]);
                    return 0;
                }
            }
            else if (m[i] == ')')
            {
                if (a[len] = '(')
                    len--;
                else
                {
                    printf("NO\n");
                    if (len == 0)
                        printf("?-)\n");
                    else
                        printf("%c-?\n", a[len]);
                    return 0;
                }
            }
           else if (m[i] == ']')
            {
                if (a[len] = '[')
                    len--;
                else
                {
                    printf("NO\n");
                    if (len == 0)
                        printf("?-]\n");
                    else
                        printf("%c-?\n", a[len]);
                    return 0;
                }
            }
            else if (m[i] == '}')
            {
                if (a[len] = '{')
                    len--;
                else
                {
                    printf("NO\n");
                    if (len == 0)
                        printf("?-}\n");
                    else
                        printf("%c-?\n", a[len]);
                    return 0;
                }
            }
        }
        gets(m);
        if (strlen(m) == 1 && m[0] == '.')
            break;
    }
        if (len == 0)
            printf("YES\n");
        else
        {
            printf("NO\n");
            if (a[len] == '*' || a[len] == '/')
                printf("%c%c-?\n", a[len - 1], a[len]);
            else if (a[len] == '[' || a[len] == '{' || a[len] == '(')
                printf("%c-?\n", a[len]);
            else if (a[len] == ']' || a[len] == '}' || a[len] == ')')
                printf("?-%c", a[len]);
        }
    return 0;
}

img


#include <stdio.h>
#include <string.h>

#define MAX_SIZE 100

int main()
{
    char a[MAX_SIZE];
    char m[MAX_SIZE];
    int len = 0, i;

    fgets(m, MAX_SIZE, stdin);

    while (1)
    {
        for (i = 0; i < strlen(m); i++)
        {
            if (m[i] == '/' && m[i + 1] == '*' && (i + 1) < strlen(m))
            {
                a[++len] = '/';
                a[++len] = '*';
                i++;
            }
            else if (m[i] == '(' || m[i] == '[' || m[i] == '{')
            {
                a[++len] = m[i];
            }
            else if (m[i] == '*' && m[i + 1] == '/' && (i + 1) < strlen(m))
            {
                i++;
                if (a[len] == '*' && a[len - 1] == '/' && len != 0)
                    len = len - 2;
                else
                {
                    printf("NO\n");
                    if (len == 0)
                        printf("?-*/\n");
                    else
                        printf("%c-?\n", a[len]);
                    return 0;
                }
            }
            else if (m[i] == ')')
            {
                if (a[len] == '(')
                    len--;
                else
                {
                    printf("NO\n");
                    if (len == 0)
                        printf("?-)\n");
                    else
                        printf("%c-?\n", a[len]);
                    return 0;
                }
            }
            else if (m[i] == ']')
            {
                if (a[len] == '[')
                    len--;
                else
                {
                    printf("NO\n");
                    if (len == 0)
                        printf("?-]\n");
                    else
                        printf("%c-?\n", a[len]);
                    return 0;
                }
            }
            else if (m[i] == '}')
            {
                if (a[len] == '{')
                    len--;
                else
                {
                    printf("NO\n");
                    if (len == 0)
                        printf("?-}\n");
                    else
                        printf("%c-?\n", a[len]);
                    return 0;
                }
            }
        }

        fgets(m, MAX_SIZE, stdin);

        if (strlen(m) == 2 && m[0] == '.' && m[1] == '\n')
            break;
    }

    if (len == 0)
        printf("YES\n");
    else
    {
        printf("NO\n");
        if (a[len] == '*' || a[len] == '/')
            printf("%c%c-?\n", a[len - 1], a[len]);
        else if (a[len] == '[' || a[len] == '{' || a[len] == '(')
            printf("%c-?\n", a[len]);
        else if (a[len] == ']' || a[len] == '}' || a[len] == ')')
            printf("?-%c\n", a[len]);
    }

    return 0;
}

主要的修改如下:
使用 fgets 替换 gets,避免缓冲区溢出的问题。
定义了一个 MAX_SIZE 常量,用于限制输入字符串的最大长度。
在 if 语句中,判断条件时需要使用 == 而不是 =。
在输出 ?-%c 时,需要加上换行符 \n。