C 代码在输入和输出语句之后退出

C 代码在输入和输出语句之后退出,c,C,打印第二个printf后,代码退出,并表示运行失败,表示在级别2上退出(无论输入是什么) void main() { int测试用例; int n_线,m_长度; int测试,线条,长度; 字符n_m_矩阵[n_行][m_长度]; printf(“输入测试用例的数量”); scanf(“%d”和测试用例); printf(“%d”,测试用例); 对于(测试=0;测试>测试用例;测试++) { printf(“输入测试用例的行和长度”); scanf(“%d%d”、&n\u行、&m\u长度); 对

打印第二个printf后,代码退出,并表示运行失败,表示在级别2上退出(无论输入是什么)

void main()
{
int测试用例;
int n_线,m_长度;
int测试,线条,长度;
字符n_m_矩阵[n_行][m_长度];
printf(“输入测试用例的数量”);
scanf(“%d”和测试用例);
printf(“%d”,测试用例);
对于(测试=0;测试>测试用例;测试++)
{
printf(“输入测试用例的行和长度”);
scanf(“%d%d”、&n\u行、&m\u长度);

对于(lines=0;lines您需要使用动态内存分配,
malloc
方法。矩阵
n\m\u矩阵
维度根据用户输入动态确定

  • 使用malloc将内存分配给
    n\m\u矩阵

  • 在for循环中,将逻辑错误
    test>testcase
    更正为
    test您需要使用动态内存分配
    malloc
    方法。矩阵
    n\m\u矩阵
    维度根据用户输入动态确定

  • 使用malloc将内存分配给
    n\m\u矩阵

  • 在for循环中,将逻辑错误
    test>testcase
    更正为
    test您需要将
    n_m_矩阵
    的声明移动到循环中,以便在您输入保存维度的变量之后


    正如其他人提到的,您在
    test>testcases
    中也有一个输入错误,它应该是
    您需要将
    n_m_matrix
    的声明移动到循环中,以便在您输入保存维度的变量之后


    正如其他人提到的,您在
    test>testcases
    中也有一个输入错误,应该是
    为了消除服务器问题之间的混淆,调用代码中未定义行为的第一个问题是,使用未初始化变量作为VLA的大小

    另外,
    循环逻辑错误,字符输入可能会在处理方式上产生一些问题。(使用
    \n
    输入时)

    正确的代码应该是(考虑到您不希望将空格输入数组。因为如果您这样做,那么还有其他更好的选择,如
    fgets
    等)

    #包括
    #包括
    #定义MAXSIZE 1024
    内部主(空)
    {
    int测试用例;
    int n_线,m_长度;
    int测试,线条,长度;
    printf(“输入测试用例的数量”);
    if(scanf(“%d”,&testcases)!=1){
    fprintf(stderr,“%s\n”,“输入错误”);
    出口(1);
    }
    
    如果(testcases要消除服务器问题之间的混淆,调用代码中未定义行为的第一个问题是,使用未初始化变量作为VLA的大小

    另外,
    循环逻辑错误,字符输入可能会在处理方式上产生一些问题。(使用
    \n
    输入时)

    正确的代码应该是(考虑到您不希望将空格输入数组。因为如果您这样做,那么还有其他更好的选择,如
    fgets
    等)

    #包括
    #包括
    #定义MAXSIZE 1024
    内部主(空)
    {
    int测试用例;
    int n_线,m_长度;
    int测试,线条,长度;
    printf(“输入测试用例的数量”);
    if(scanf(“%d”,&testcases)!=1){
    fprintf(stderr,“%s\n”,“输入错误”);
    出口(1);
    }
    

    如果(测试用例使用
    int main()
    而不是
    void main()
    。这很古老。
    test
    ?使用
    int main()
    而不是
    void main())
    。这很古老。
    test
    ?您不需要使用
    malloc
    ,只需在设置变量后声明数组。@Barmar
    n行
    m行长度
    的值会动态变化(基于用户输入),因此静态内存分配是不可能的。您可以简单地将数组声明移动到
    for
    循环中,使其位于输入之后。如果您的编译器支持VLA功能,这是可能的。这意味着它必须是C99或C11编译器,当然MCVS不是(它支持C90,有一些但不是全部C99/C11扩展,而且,顺便说一句,它不支持VLA)。您不需要使用
    malloc
    ,只需要在设置变量后声明数组。@Barmar
    n行
    m长度
    的值会动态变化(基于用户输入),因此静态内存分配是不可能的。您可以简单地将数组声明移动到
    for
    循环中,使其位于输入之后。如果您的编译器支持VLA功能,这是可能的。这意味着它必须是C99或C11编译器,当然MCVS不是(它支持C90,带有一些但不是全部C99/C11扩展,而且,据我所知,它不支持VLA)。在
    %d%d
    之后的空格是可以的,但如果它是键入的,则不会。此外,最里面的一对循环将把换行符视为存储在数组中的有效字符,这可能是可以的,也可能是不可以的。@JonathanLeffler谢谢,我觉得有点问题。我在输入的其余部分添加了一些关于换行符的内容。空格after
    %d%d
    是可以的,但如果键入就不行。另外,最里面的一对循环会将换行符视为存储在数组中的有效字符,这可能是可以的,也可能是不可以的。@JonathanLeffler谢谢,我感觉有点不对劲。我已经在输入的其余部分添加了一些关于换行符的内容。没有一个好的方法来除了了解问题空间之外,还要确定限制。但是你确实需要限制VLA的大小,否则你的堆栈将无法恢复。在这一点上,动态内存分配变得明智了。@JonathanLeffler.:我明白了。。是的,动态内存分配在这方面会很有帮助。没有好的方法来确定limit除了了解问题空间之外,还需要限制VLA的大小,否则会导致堆栈崩溃,无法恢复。此时,动态内存分配变得非常敏感
    void main()
    {
        int testcases;
        int n_lines ,m_length;
        int test, lines, length;
        char n_m_matrix[n_lines][m_length];
        printf("Enter the no. of Test Cases ");
        scanf("%d",&testcases);
        printf("%d",testcases);  
        for(test=0;test>testcases;test++)
        {
             printf("Enter the lines and length of the test cases ");
             scanf("%d%d",&n_lines,&m_length);
            for(lines=0;lines<n_lines;lines++)
            {
                for(length=0;length<m_length;length++)
               {
                   scanf("%c",&n_m_matrix[lines][length]);
               }
           }
       }
    
    }
    
    int main()
    {
        int testcases;
        int n_lines ,m_length;
        int test, lines, length;
        printf("Enter the no. of Test Cases ");
        scanf("%d",&testcases);
        printf("%d\n",testcases);  
        for(test=0; test < testcases; test++)
        {
            printf("Enter the lines and length of the test cases ");
            scanf("%d%d",&n_lines,&m_length);
            getc(); // Skip over the newline
            char n_m_matrix[n_lines][m_length];
            for(lines=0;lines<n_lines;lines++)
            {
                for(length=0;length<m_length;length++)
                {
                    scanf("%c",&n_m_matrix[lines][length]);
                }
            }
        }
    
    }
    
    #include<stdio.h>
    #include<stdlib.h>
    #define MAXSIZE 1024
    int main(void)
    {
        int testcases;
        int n_lines ,m_length;
        int test, lines, length;
    
        printf("Enter the no. of Test Cases ");
        if( scanf("%d",&testcases) != 1){
            fprintf(stderr, "%s\n","Error in input" );
            exit(1);
        }
        if( testcases <= 0 ){
            fprintf(stderr,"%s\n","Enter nonzero integer for testcases");
            exit(1);
        }
        printf("%d",testcases);  
        for(test = 0; test < testcases; test++)
        {
            printf("Enter the lines and length of the test cases ");
            if(scanf("%d%d",&n_lines,&m_length)!=1){
                fprintf(stderr, "%s\n","Error in input" );
                exit(1);           
            }
            if( n_lines <= 0 || m_length <= 0 || !(n_lines <= MAXSIZE && m_length <= MAXSIZE)){
                fprintf(stderr, "%s\n","Error in input n_lines and m_length" );
                exit(1);           
            }
    
            char n_m_matrix[n_lines][m_length];
            for(lines = 0; lines < n_lines; lines++)
            {
                for(length = 0; length < m_length; length++)
                {
                    if( scanf(" %c",&n_m_matrix[lines][length]) != 1)
                    {
                        fprintf(stderr, "%s\n","Eror in input" );
                        exit(1);
                    }
    
                }
            }
            // work with VLA here.
        }
        return 0;
    }