fgets函数
fgets函数与gets函数
请移步下方链接,其中包含了scanf函数
、gets函数
以及fgets函数
的区分总结:
fgets函数包含回车符
原因
-
字符数组,回车符也可包含在其中
-
fgets
函数将回车从缓冲区取出来自己留下(而gets函数是将回车从缓存区取出扔掉),因此用fgets
函数输入字符串时,字符串末尾将携带有回车符,缓冲区清空。而
getchar
()吸收回车符是从缓冲区中读取,因此在用fgets
输入时,想用getchar()
吸收末尾的回车符是不可行的
消去回车符
需要消去回车符的情况
以字符插入题为例
任务描述
题目描述:输入两个字符串a
和b
,将b
串中的最大字符插入到a
串中最小字符后面。
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End
区域内进行代码补充。 输入 输入一段文字 输出 输入两个字符串a
和b
。
测试说明
样例输入: MynameisAmy
MynameisJane
样例输出: MynameisAymy
提示: 字符串长度不超过100
思路
- 输入两个字符串
- 分别遍历,找到
a
串最小的字符及其位置和b
最大的字符 - 分三段输出:
a
串最小字符及其前的内容,b
串最大的字符,a
串剩余的部分
代码
#include <stdio.h>
#include <string.h>
int main(void)
{
/*********Begin*********/
char a[100],b[100];
int i=0,j=0,len1=0,len2=0,mark=0;
char min,max;
//输入a,b字符数组
fgets(a,100,stdin);
fgets(b,100,stdin);
//得到数组长度,便于后续遍历
len1=strlen(a);
len2=strlen(b);
//输入5个字符,但通过编译可知len1和len2的长度实际上为6,说明尾部的回车符也被录入字符数组中
//因为是通过ASCII码来寻找数组中最大和最小的字符,这样的情况就会导致回车符干扰排序,无法输出正确的结果
//找到a串最小的字符及其位置
min=a[0];
//处理回车符,这里有两种方法(二选一即可):
//法一:将'\n'改为'\0'
a[len1-1]='\0';
//法二:将循环止于回车符前,即i<len1-1
for(i=0;i<len1-1;++i){
if(a[i]<min){
min=a[i];
mark=i;
}
}
//找到b最大的字符
max=b[0];
for(j=0;j<len2;++j){
if(b[j]>max){
max=b[j];
}
}
//分三段输出:
//a串最小字符及其前的内容
for(i=0;i<=mark;++i){
printf("%c",a[i]);
}
//b串最大的字符
printf("%c",max);
//a串剩余的部分
for(i=mark+1;i<len1;++i){
printf("%c",a[i]);
}
printf("\n");
/*********End**********/
return 0;
}
问题关键
消去操作
-
先用strlen函数得出该字符串长度(以字符数组a为例)
-
法一:将
'\n'
改为'\0'
#include<stdio.h> #include<string.h> int main(){ char a[100]; int len=0; fgets(a,100,stdin); len=strlen(a); a[len-1]='\0' return 0; }
法二:将循环止于回车符前,即
i<len-1
#include<stdio.h> #include<string.h> int main(){ char a[100]; int len=0,i=0; fgets(a,100,stdin); len=strlen(a); for(i=0;i<len-1;++i){ } return 0; }