求助大佬:如何解决char类型多维数组的多次输入问题?

问题遇到的现象和发生背景

这个本来是c语言课的作业,老师让我们先输入数字确定操作次数然后再输入英语单词或句子,要求输出结果没有元音,我的想法是弄出来两个多维数组,一个用来存放操作前的单词或者句子,一个用来存放操作之后的,但是我发现操作数为1的时候程序自动结束了,而且操作数大于等于二的时候会出现乱码并且只能输入一次句子,想问问大佬为什么。

用代码块功能插入代码,请勿粘贴截图
#include<stdio.h>  
#include<string.h>
int main()
{   int i=0,j=0,t=0,n=0;
    scanf("%d",&t);//t是操作次数// 
    char v[10][30];//v是原来的句子// 
    char nv[10][30];//nv是操作之后的句子// 
    for(i=0;i<t;i++){
      gets(v[i]);
      for(j=0;j<strlen(v[i]);j++){
          if(v[i][j]!='a'&&v[i][j]!='o'&&v[i][j]!='e'&&v[i][j]!='i'&&v[i][j]!='u'&&
           v[i][j]!='A'&&v[i][j]!='O'&&v[i][j]!='E'&&v[i][j]!='I'&&v[i][j]!='U'){
           nv[i][n]=v[i][j];
           n++;
           }
        } 
    }
    for(i=0;i<t;i++){
      printf("%s\n",nv[i]);
    }
    return 0;     
}

运行结果及报错内容

输入1的时候:

1
?@

输入2和hello的时候:

2
hello
?@
hll

我的解答思路和尝试过的方法

我一开始尝试过更改scanf里的内容,更改for语句里第二个条件句的内容但是都失败了,还试过gets换成scanf也失败了。。。

我想要达到的结果

希望大佬能告诉我这个哪里错了并且应该怎么改,感谢!

scanf(),这一句后面加个getchar(),把换行符读掉,你不把换行符处理掉的话,你循环开始,gets()读取字符串时,此时会读一个换行符就直接结束读取了。另外还有个错误,就是你每次循环之前要把n的值归为零。修改代码如下,记得采纳一下哦!

#include<stdio.h>  
#include<string.h>
int main()
{   int i=0,j=0,t=0,n=0;
    scanf("%d",&t); //t是操作次数// 
    getchar();  // 将换行读取掉 
    char v[10][30]; //v是原来的句子// 
    char nv[10][30]; //nv是操作之后的句子// 
    for(i=0;i<t;i++){
        n=0; // n的值归 0 
        gets(v[i]);
        for(j=0;j<strlen(v[i]);j++){
          if(v[i][j]!='a'&&v[i][j]!='o'&&v[i][j]!='e'&&v[i][j]!='i'&&v[i][j]!='u'&&
           v[i][j]!='A'&&v[i][j]!='O'&&v[i][j]!='E'&&v[i][j]!='I'&&v[i][j]!='U'){
            nv[i][n]=v[i][j];
            n++;
           }
        } 
    }
   
    for(i=0;i<t;i++){
      printf("%s\n",nv[i]);
    }
    return 0;     
}

img

你用scanf()获取输入的时候,结束时你按回车,后面还有scanf的话,那么回车符号就被后面的scanf获取了,就会出现获取错误,在scanf后面加个getchar()获取每一次的回车符就好😄
代码如下:

#include<stdio.h>  
#include<string.h>
int main()
{   int i=0,j=0,t=0,n=0;
    scanf("%d",&t); //t是操作次数// 
    getchar();  // 吃掉换行符
    char v[10][30]; //v是原来的句子// 
    char nv[10][30]; //nv是操作之后的句子// 
    for(i=0;i<t;i++){
        gets(v[i]);
        for(j=0;j<strlen(v[i]);j++){
          if(v[i][j]!='a'&&v[i][j]!='o'&&v[i][j]!='e'&&v[i][j]!='i'&&v[i][j]!='u'&&
           v[i][j]!='A'&&v[i][j]!='O'&&v[i][j]!='E'&&v[i][j]!='I'&&v[i][j]!='U'){
            nv[i][n]=v[i][j];
            n++;
           }
        } 
    n=0;//每次操作过后n的值重新置为0
    }
    for(i=0;i<t;i++){
      printf("%s\n",nv[i]);
    }
    return 0;     
}


第一,需要用getchar()或者fllush()清除缓存
第二,在字符串遍历前,没有把下标n置0
第三,没有给字符串nv添加字符串的结束符'\0'

#include<stdio.h>
#include<string.h>
int main()
{
    int i=0,j=0,t=0,n=0;
    scanf("%d",&t);//t是操作次数//
    char v[10][30];//v是原来的句子//
    char nv[10][30];//nv是操作之后的句子//
    for(i=0; i<t; i++)
    {
        //fflush(stdin);
        getchar();
        gets(v[i]);
        n=0;//重置下标
        for(j=0; j<strlen(v[i]); j++)
        {
            if(v[i][j]!='a'&&v[i][j]!='o'&&v[i][j]!='e'&&v[i][j]!='i'&&v[i][j]!='u'&&
                    v[i][j]!='A'&&v[i][j]!='O'&&v[i][j]!='E'&&v[i][j]!='I'&&v[i][j]!='U')
            {
                nv[i][n]=v[i][j];
                n++;
            }
        }
        nv[i][n]='\0';//加字符串结束符
    }
    for(i=0; i<t; i++)
    {
        printf("%s\n",nv[i]);
    }
    return 0;
}

C语言中scanf和getchar多次循环输入
https://blog.csdn.net/weixin_56054625/article/details/121237408