在做“括号的匹配”这道C语言题的时候,使用多维字符串的时候不能正常输入

在编译过程中没有问题,在运行时发现不能够按预定的输入n行字符串,在我令n≥3

img


时,仅仅输入两行后就不能够继续输入了


#include <stdio.h> //头文件:包含标准输入输出函数
#include <string.h> //头文件:包含字符串处理函数

#define MAXN 1000 //定义常量MAXN为1000

int main() {
    int n; //定义变量n,表示括号匹配表达式的个数
    int index[10]; //定义数组index,保存每个表达式的匹配结果
    int j=0; //定义变量j,表示当前保存结果的位置
    scanf("%d", &n); //读入变量n
    getchar(); //接收输入中的换行符
    int n_copy = n; //保存n的值
    while (n--) { //循环读入n个表达式并判断括号是否匹配
        char stack[MAXN]; //定义字符数组stack,模拟栈
        int top = 0; //定义变量top,表示栈顶指针,初值为0
        char str[MAXN]; //定义字符数组str,保存当前的表达式
        fgets(str, MAXN, stdin); //读入输入行,存储到字符数组str中
        int len = strlen(str); //len表示读入行的长度
        int flag = 1; //定义变量flag,表示括号是否匹配,初值为1
        for (int i = 0; i < len; i++) { //遍历字符数组str中的每个字符
            if (str[i] == '(') { //如果当前字符是左括号
                stack[top++] = str[i]; //栈顶指针加1,将左括号压入栈中
            } else if (str[i] == ')') { //如果当前字符是右括号
                if (top == 0) { //如果栈为空
                    flag = 0; //说明右括号多于左括号,括号不匹配
                    break; //跳出循环
                } else {
                    top--; //栈顶指针减1,弹出栈顶的左括号
                }
            }
        }
        if (top != 0) {flag = 0;} //如果栈非空,说明左括号多于右括号,括号不匹配
        if (flag) { //如果括号匹配
            index[j++]=1; //将结果保存到数组index中,1表示匹配
        }
        else {
            index[j++]=-1; //将结果保存到数组index中,-1表示不匹配
        }
    }
    for(j=0;j<n_copy;j++){ //循环输出每个表达式的匹配结果
        if(index[j]==1){ //如果结果为1,说明括号匹配
            printf("yes\n"); //输出yes
        }
        else if(index[j]==-1){ //如果结果为-1,说明括号不匹配
            printf("no\n"); //输出no
        }
    }
    return 0; //程序结束
}

你好,第十三行,第十七行,有不合理的地方,改成

if(str[i][j] == '(')  // 第13行改

if((str[i][m] == ')' )&& (m > j))  // 第17行改

这种情况可能是由于程序在读取输入时发生了阻塞,导致程序停止响应。有几种可能的原因:

  • 程序在读取输入时使用了固定的缓冲区大小,但输入的字符串长度超出了缓冲区大小,导致程序阻塞。可以尝试增大缓冲区的大小或者使用动态缓冲区来解决。

  • 程序在读取输入时没有处理好输入结束的情况,导致程序一直等待输入而无法继续执行。可以在读取每行输入之后判断输入是否结束,如果结束则跳出循环。

  • 程序在读取输入时发生了其他的错误,导致程序停止响应。可以增加异常处理来捕获错误并处理。
    你可以检查一下你的程序是否存在上述问题,并进行相应的修复。同时,如果问题仍然存在,可以尝试使用调试工具来定位问题。

引用new bing部分指引作答:
您好,您的程序中有一些语法错误和逻辑错误。

首先,字符串数组的大小不应该是10和30,因为输入的字符串数量和长度都是不确定的。您可以考虑使用动态内存分配函数malloc分配足够的内存来存储输入的字符串。

其次,您在使用gets函数时,应该避免输入空行,因为gets会读取输入的换行符并将其视为字符串的一部分。建议您使用fgets函数来读取输入,它可以读取指定数量的字符或直到遇到指定的终止符号(如换行符)。

另外,字符串比较时应该使用双等号==而不是单等号=,单等号会将判断语句转化为赋值语句。

最后,您的括号匹配逻辑有误,应该使用一个栈来存储左括号,当遇到右括号时,从栈中弹出最近的左括号进行匹配。如果栈为空或弹出的左括号与当前右括号不匹配,则判定为不匹配。

下面是修改后的程序:

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

int main()
{
    int n = 0;
    scanf("%d", &n);
    getchar(); // 读取换行符

    char **str = (char **)malloc(n * sizeof(char *));
    char **judge = (char **)malloc(n * sizeof(char *));
    char answer1[] = "yes";
    char answer2[] = "no";

    for (int i = 0; i < n; i++) {
        str[i] = (char *)malloc(100 * sizeof(char));
        fgets(str[i], 100, stdin);
        str[i][strlen(str[i]) - 1] = '\0'; // 去掉换行符
        judge[i] = (char *)malloc(5 * sizeof(char));
        int len = strlen(str[i]);
        int count = 0;
        for (int j = 0; j < len; j++) {
            if (str[i][j] == '(') {
                count++;
            } else if (str[i][j] == ')') {
                count--;
                if (count < 0) {
                    strcpy(judge[i], answer2);
                    break;
                }
            }
        }
        if (count == 0) {
            strcpy(judge[i], answer1);
        } else {
            strcpy(judge[i], answer2);
        }
    }

    for (int i = 0; i < n; i++) {
        printf("%s\n", judge[i]);
    }

    for (int i = 0; i < n; i++) {
        free(str[i]);
        free(judge[i]);
    }
    free(str);
    free(judge);

    return 0;
}

先把下面错误改了试试

第11行   str[i][30]  改成 str[i][j] 
第13行   =  改成 ==
第15行   str[i][30]  改成 str[i][m] 
第17行   =  改成 ==    & 改成 &&

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
首先,需要明确的是,在 C 语言中,多维字符串并不存在。字符串本质上就是字符数组,而使用字符数组的时候可以定义为一个二维数组,但是这并不是多维字符串。

假设你要输入 n 行字符串,那么可以先定义一个 n 行,每行最多有 M 个字符的二维字符数组,代码如下:

#include <stdio.h>
#define MAX_N 100
#define MAX_M 100

int main() {
  char input[MAX_N][MAX_M];
  int n, i;

  scanf("%d", &n);
  for (i = 0; i < n; i++) {
    scanf("%s", input[i]);
  }
  for (i = 0; i < n; i++) {
    printf("%s\n", input[i]);
  }

  return 0;
}

在上面的代码中,首先定义了一个二维字符数组 input,其中第一维表示行号,第二维表示每行最多能够存储的字符数。然后,通过 scanf 函数获取用户输入的 n,接着通过循环来输入每一行的字符串,最后通过循环将所有输入的字符串输出回去。

需要注意的是,上述代码的缺点是不能够读入带空格的字符串,只能够读取不带空格的字符串。如果需要读取带空格的字符串,则需要使用 fgets 函数,如下所示:

#include <stdio.h>
#define MAX_N 100
#define MAX_M 100

int main() {
  char input[MAX_N][MAX_M];
  int n, i;

  scanf("%d", &n);
  getchar();    // 读走换行符
  for (i = 0; i < n; i++) {
    fgets(input[i], MAX_M, stdin);
  }
  for (i = 0; i < n; i++) {
    printf("%s", input[i]);
  }

  return 0;
}

在上述代码中,我们用了 getchar 函数读走了输入 n 后留下的一个换行符,然后使用 fgets 函数读入带空格的字符串。需要注意的是,在使用 fgets 函数之后,字符串最后会有一个换行符,需要在输出时去掉。
如果我的回答解决了您的问题,请采纳!