C fgets是否有永久解决方案

C fgets是否有永久解决方案,c,fgets,C,Fgets,请告诉我如何正确使用fgets,每次我在循环中获取输入。因为我的for循环只工作一次,然后程序就会中断。我也尝试过使用buffer和getc,但似乎没有任何效果 #include <stdio.h> #include <string.h> #include <stdlib.h> int main(void){ int k,i,j,t,n,m; char buffer[100]; f

请告诉我如何正确使用fgets,每次我在循环中获取输入。因为我的for循环只工作一次,然后程序就会中断。我也尝试过使用buffer和getc,但似乎没有任何效果

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    int main(void){
        int k,i,j,t,n,m;
        char buffer[100];
        fgets(buffer,100,stdin);
        sscanf(buffer,"%d",&t);
        while(t--){
            char buffer1[100];
            fgets(buffer1,100,stdin);
            sscanf(buffer1,"%d%d",&n,&m);
            char pattern[n+1][m+1];
            for(i=0;i<n;i++){
                fgets(pattern[i],m,stdin);
            }
        }
    }
    /* My OUTPUT:
2
2 3
RGR
GRR
3 4
Process returned 0 (0x0)   execution time : 8.106 s
Press any key to continue.
where as I wanted this:
2
2 3
RGR  (this is just random input
GRR   )
3 4 
RRGG (this is just random input
GRRR
RGGG  )
*/
#包括
#包括
#包括
内部主(空){
int k,i,j,t,n,m;
字符缓冲区[100];
fgets(缓冲器,100,标准输入);
sscanf(缓冲区、%d、&t);
而(t--){
字符缓冲区1[100];
fgets(buffer1100,stdin);
sscanf(缓冲区1、%d%d、&n和&m);
字符模式[n+1][m+1];

对于(i=0;i,您仍然没有充分保护函数,以便在其中任何一个函数出现故障时能够捕获它。我要说的是检查函数的返回值,并对函数中使用的参数进行少量检查

#include<stdio.h>
#include<stdlib.h>
int main(void){
    int t;
    char buffer[100];
    if( fgets(buffer,100,stdin) == NULL ){
        fprintf(stderr, "%s\n", "Input Error using fgets");
        exit(1);
    }
    if( sscanf(buffer,"%d",&t) != 1){
        fprintf(stderr, "%s\n", "Input Error using sscanf");
        exit(1);
    }
    if( t < 0 ){
        fprintf(stderr, "%s\n","Error in inputting t" );
        exit(1);
    }
    while(t--){
        char buffer1[100];
        if( fgets(buffer,100,stdin) == NULL ){
            fprintf(stderr, "%s\n", "Input Error using fgets");
            exit(1);
        }
        int n,m;   
        if( sscanf(buffer1,"%d%d",&n,&m) == 2){
            fprintf(stderr, "%s\n", "Input Error using sscanf");
            exit(1);       
        }

        if(!( n && m) ){
            fprintf(stderr, "%s\n", "Error in input n,m" );
            exit(1);
        }
        char pattern[n+1][m+1];
        for(size_t i=0;i<n;i++){
            if( fgets(pattern[i],m,stdin)== NULL){
                fprintf(stderr, "%s\n","Error in input" );
                exit(1);
            }
        }
    }
    return 0;
}
#包括
#包括
内部主(空){
int t;
字符缓冲区[100];
如果(fgets(缓冲区,100,标准输入)=NULL){
fprintf(stderr,“%s\n”,“使用fgets输入错误”);
出口(1);
}
如果(sscanf(缓冲区、%d、&t)!=1){
fprintf(stderr,“%s\n”,“使用sscanf时输入错误”);
出口(1);
}
if(t<0){
fprintf(stderr,“%s\n”,“输入t时出错”);
出口(1);
}
而(t--){
字符缓冲区1[100];
如果(fgets(缓冲区,100,标准输入)=NULL){
fprintf(stderr,“%s\n”,“使用fgets输入错误”);
出口(1);
}
int n,m;
如果(sscanf(缓冲区1、%d%d、&n、&m)==2){
fprintf(stderr,“%s\n”,“使用sscanf时输入错误”);
出口(1);
}
如果(!(n&m)){
fprintf(stderr,“%s\n”,“输入错误n,m”);
出口(1);
}
字符模式[n+1][m+1];

对于(size_t i=0;i请参见。您面临的问题是什么?并且您没有检查任何内容的返回值。请始终检查scanf和fgets的返回值。scanf的结果实际上可能会让您感到惊讶。您确实需要在模式中的%d之间设置分隔符。基本调试技术:检查返回值(特别是从输入函数),并打印出正在进行的操作(或使用调试器)。另请参阅。当问题陈述只是“它不工作”时,很难提供解决方案。请您的问题更完整地描述您预期会发生的情况,以及与实际结果的差异。请参阅,以获取有关什么是好的解释的提示。