2014年第七题
2017-10-08 本文已影响0人
Tyihou
image.png
#include<stdio.h>
#pragma warning(disable:4996)
//这个你不用管,这个只是一个和编译器有关的语句,考试的时候不用写
int main() {
char buf[1024],str[128];
//声明一个buf总字符数组,然后声明一个str的临时字符数组
buf[0] = 0;
//这一步是为了清空字符串,只要把字符数组的开始字符置为0,系统就会认为这个字符串为一个空串为了在接下来比如说一些strlen函数的时候,能够不出错,
int i,n,m=5;
printf("请输入一个整数M:");
scanf("%d", &m);
//fflush(stdin); /*清空缓冲区,也可以使用rewind(stdin);*/
//使用setbuf(stdin,null);可以使stdin输入流由默认缓冲区转为无缓冲区,这样scanf输入完毕后,缓冲区内的东西就消失了。
//setbuf(stdin, NULL);
int c;
while ((c = getchar()) != '\n' && c != EOF);
/*前边的这两句是一个清楚缓冲区的操作,应为在调用一些输入函数时,比如scanf、gets、getchar、getc、fgetc的时候,没有读取的字符比如说换行符,
就会一直存在输入缓冲区stdin里边,这样在下次再调用其他输入函数时候,就会读取以前缓冲区中的字符,而出现意向之外的情况,所以这里进行一个清空操作
而清空操作有好几种方法,fflush(stdin)这个函数在一些平台上会不起作用,所以不推荐用,setbuf(stdin,null)是关闭缓冲区的意思,也能起到效果,但是不建议
最好的就是用c语言语句实现缓冲区清空, while ((c = getchar()) != '\n' && c != EOF);这句话的意思是,从缓冲区持续读入字符,直到遇到换行或者结束符为止,
这样就起到了清空缓冲区的作用!
*/
printf("请输入字符串:");
//这个程序的逻辑很好理解,就是用一个while循环一直读取字符串,直到遇见end的时候,就会终止读取并且调用show函数,输出
while (1) {
gets(str);
n = strlen(str);
int f = strcmp(str, "end");
//使用strcmp函数判断是否相等,宝贝,我建议你看一下这个函数,包括这个函数返回的数据,
/*设这两个字符串为str1,str2,
调用strcmp(str1,str2)时
若str1 == str2,则返回零;
若str1<str2,则返回负数;
若str1>str2,则返回正数。*/
if (f == 0) {
show(buf,m);
break;
}
int num = strlen(buf);
if (n>(1024 - num)) break;
//这一步判断buf中还能不能存入这些字符,如果能的话,就继续存,如果不能就退出循环,程序结束..
strcat(buf, str);
//把临时字符串str中的字符串追加到buf中,然后把str字符数组清空
str[0] = 0;
printf("您已经输入%3d个字符,请继续输入字符串:",strlen(buf));
//这里的%3d的意思是按整形输出但是至少占三个位,这样就起到的输出的字符长度看起来大小一样的效果
}
system("pause");
return 0;
}
int show(char buf[],int m) {
int n,i,s;
n = strlen(buf);
if (n<=m)
//根据题意判断buf字符数组的长度与m的长度
{
printf("您输入的的M的值为%d,大于或等于buf中的字符个数%d,所以输出全部%d个字符为:", m, n, m);
for (i=0;i<n;i++)
{
printf("%c", buf[i]);
}
printf("\n");
}
else
{
printf("您输入的的M的值为%d,小于buf中的字符个数%d,所以输出最后%d个字符为:", m,n,m);
for (i = n-m; i <= n; i++) {
printf("%c", buf[i]);
}
printf("\n");
}
}
image.png