# A1031 输出图形helloworld以及gets()的使用问题

A1031 输出图形helloworld以及gets()的使用问题

实际上在图像输出题目上,我一直以为是控制输出法,所谓控制输出法就是一边输入一遍输出,走一步看一步,这是个办法,也能解决大部分问题,但有时比较伤脑筋。

所以在刷题的时候我关注到了一个新的想法,整体法,那就是把图先画好,然后再一次性都输出了。方法就是设置一个二维数组。想象一下把二维数组摊开在A4纸上,是不是密密麻麻的方格,在每一个方格中添入我要的东西,其它放个填入‘ ’空格,那么最后输出的就是那个形状吧,所以这里贴上A1031这道题的代码。

#include
#include
#include
#include
#include 
int main(){
    char str[100];//收入代码
    char ans[40][40];//画图用的数组
    
    fgets(str,100,stdin);//重点知识,这里不用gets()了。
	
    int N = strlen(str)-1;//fgets会把最后了个回车字符也算进去,所以真正的字符数是减去一的。
    int n1,n2,n3;
    n1 = (N+2)/3;
    n3 = n1;
    n2 = N+2-n1-n3;
	
	for(int i=1;i<=n1;i++){
		for(int j=1;j<=n2;j++){
			ans[i][j] = ' ';//初始化数组,可以理解为拿出一张白纸
		}
	}
    int pos = 0;
	//开始画图 
	for(int i=1; i<=n1; i++){
        ans[i][1] = str[pos++];//第一列 
    }
     
    for(int j=2;j<=n2;j++){//最后一行
    	ans[n1][j] = str[pos++];
	}
	
	for(int i=n3-1;i>=1;i--){//最后一列
		ans[i][n2] = str[pos++];
	}
	
	for(int i=1;i<=n1;i++){//一起输出
		for(int j=1;j<=n2;j++){
			printf("%c",ans[i][j]);
		}
		printf("\n");//别忘了输出是按行输出的,要换行,我当时就给忘了。
	}
	return 0;
}

我们定义了一个数组char src[5],这时候我们调用gets(src),来从标准输入读取字符串,我们看到gets()函数的参数为数组名,我们都知道,数组名就相当于一个指针,也就是数组的首地址。这时如果我们的输入大于5个字符,比如 I love BIT,gets()函数会从src所指地址开始,依次填入每个字符,但是src只分配了5个字节的空间,填满这五个空间后,gets()函数就会访问未被分配的内存空间,如果这片空间已经存有数据,这时程序就会发生错误,而中断。

正式由于gets()函数的这个缺陷,在C99标准中,已经不再建议使用gets()函数,而在C11中更是直接抛弃了这个函数。

gets()被抛弃,那我们用什么来代替它的功能呢?

C11标准新增了gets_s()函数可以代替gets()函数,但是,该函数是stdio.h输入输出函数系类中的可选扩展,因此,即使编译器支持C11标准,也有可能不支持gets_s()函数。

其实我们可以用c语言中的fgets()函数来代替gets()

我们先看一下函数原型声明:

char *fgets(char *buf, int bufsize, FILE *stream);

注意一下第二个参数bufsize,这个参数就限制了读取的字符的个数,这就可以解决gets()函数的缺陷。

我们知道fgets() 函数主要用于读取文件,如果要读取键盘,则stream参数应该为stdin,

需要注意的是,如果bufsize设置为n,那么fgets()函数最多读取n-1个字符,之所以用“最多”这个词是因为,如果在之前遇到了换行符,fgets函数也会返回。

还有一点就是,fgets()函数会读取换行符(这一点和gets函数不同),当读取结束后,fgets函数会为buf在末尾添加一个空字符作为字符串的结束。

综合来说就是 gets()有些编译器已经不认了,最稳当的做法是使用fgets();

//fgets()的具体用法
/*先看一下函数原型声明:
> 
> char *fgets(char *buf, int bufsize, FILE *stream);*/
fgets(变量,size,stdin)

fputs(变量,stdout)

这个问题当时困扰我很九,为什么gets()不让用了,具体操作可以看我A1031这道题的实践。
所以在此分享一下。谢谢。

具体大家可以点开这个链接gets我也是引用了这个文章,但是自己找不太好找,所以直接给需要看的朋友。

https://www.cnblogs.com/qingergege/p/5925811.html

你可能感兴趣的:(C语言学习)