这个本来是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;
}
你用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