精华内容
下载资源
问答
  • gets和fgets函数的区别

    2020-03-09 13:48:54
    1、函数原型 char *gets(char *s);...gets从标准输入读取,fgets从指定的流读取。 fgets必须指定缓冲区的长度 size,此函数一直读到下一个换行符为止,但是不超过 size - 1 个字符,读入的字符被送入缓...

    目录

    1、函数原型

    2、函数描述

    3、fgets程序演示

    3.1 第一种输入小于(NUM-1)个字符(NUM这里为5,为什么是NUM-1,看上面描述)

    3.2 第二种输入大于等于(NUM-1)个字符(NUM这里为5)

    4、gets演示程序

    5、总结


     

    1、函数原型

    char *gets(char *s);
    char *fgets(char *s, int size, FILE *stream);

    2、函数描述

    这两个函数都指定了缓冲区的地址,读入的行将送入其中。gets从标准输入读,而fgets则从指定的流读

    对于fgets,必须指定缓冲的长度n。此函数直读到下一个 换行符为止,但是不超过n-1 个字符,读入的字符被送入缓冲区。该缓冲区以null字节结尾。如若该行包括最后一个换行符的字符数超过n-1,则fgets只返回一个不完整的行,但是,缓冲区总是以null字节结尾。对fgets的下一次调用 会继续读该行。

    gets是一个不推荐使用的函数,其问题在于调用者使用gets函数时,不能指定缓冲区的长度,这样就可能造成缓冲区溢出(如若行长于缓冲区长度),写到缓冲区之后的空间中,从而产生不可预料的后果。这种缺陷曾被利用,造成1988年的因特网蠕虫事件。gets和fgets另外一个区别在于,gets函数并不将换行符存入缓冲区。

    3、fgets程序演示

    3.1 第一种输入小于(NUM-1)个字符(NUM这里为5,为什么是NUM-1,看上面描述)

    #include <stdio.h>
    #include <string.h>
    
    #define NUM 5
    
    int main(void)
    {
        char str1[NUM] = {'L', 'L', 'L', 'L', 'L'};		//使用特定字符填充缓冲区
    
        fgets(str1, NUM, stdin);
    	printf("len = %d str1 = %s\n", (int)strlen(str1) ,str1);
    	for(int i=0; i<NUM; i++)
    	{
    		if(str1[i] == '\0')			
    			printf("str1[%d]    %d    %s\n", i, (int)str1[i],  "null");		//null字节
    		else if(str1[i] == '\n')
    			printf("str1[%d]    %d    %s\n", i, (int)str1[i],  "\\n");		//换行符
    		else
    			printf("str1[%d]    %d    %c\n", i, (int)str1[i],  str1[i]);
    	}
        return 0;
    }

    运行程序。比如输入“aaa”,运行结果如下:

    出现疑问了,我们不是输入三个字符吗?这里怎么显示的是4呢?原因是,我们输入三个字符后,按下了回车('\n'),所以 \n也被当做字符存储在数值中了。字符串必须以null字节结尾,null字节是被函数本身加上去的。数组分布情况如下:

    运行程序。比如输入“aa”两个字符,运行结果如下:

    依旧以null字节结尾,注意最后一个字节是初始化时设置的,这里不算。strlen 函数计算字符串时,以null字节结束。所以这里为3。

    3.2 第二种输入大于等于(NUM-1)个字符(NUM这里为5)

    修改程序如下

    #include <stdio.h>
    #include <string.h>
    
    #define NUM 5
    
    int main(void)
    {
    	
        char str1[NUM] = {'L', 'L', 'L', 'L', 'L'};		//使用特定字符填充缓冲区
    	char str2[NUM] = {'L', 'L', 'L', 'L', 'L'};		//使用特定字符填充缓冲区
    
    	//第一次读取
    	printf("第一次读取\n");
        fgets(str1, NUM, stdin);
    	printf("len1 = %d str1 = %s\n", (int)strlen(str1) ,str1);
    	for(int i=0; i<NUM; i++)
    	{
    		if(str1[i] == '\0')			
    			printf("str1[%d]    %d    %s\n", i, (int)str1[i],  "null");		//null字节
    		else if(str1[i] == '\n')
    			printf("str1[%d]    %d    %s\n", i, (int)str1[i],  "\\n");		//换行符
    		else
    			printf("str1[%d]    %d    %c\n", i, (int)str1[i],  str1[i]);
    	
    	}
    
    	//第二次读取
    	printf("第二次读取\n");
    	fgets(str2, NUM, stdin);
    	printf("len2 = %d str2 = %s\n", (int)strlen(str2) ,str2);
    	for(int i=0; i<NUM; i++)
    	{
    		if(str2[i] == '\0')			
    			printf("str2[%d]    %d    %s\n", i, (int)str2[i],  "null");		//null字节
    		else if(str2[i] == '\n')
    			printf("str2[%d]    %d    %s\n", i, (int)str2[i],  "\\n");		//换行符
    		else
    			printf("str2[%d]    %d    %c\n", i, (int)str2[i],  str2[i]);
    	
    	}
        return 0;
    }
    

    运行程序,输入“aaaa

    我们发现第一次读取的时候还是以null字节结尾,\n没有被读取,因为我们一次只读取 NUM-1 个字符,数组最后的那个字节被填充成null。接着第二次读取,fgets从第一次读取后的那个位置接着读取,\n就被读出来了。

    4、gets演示程序

    #include <stdio.h>
    #include <string.h>
    
    #define NUM 5
    
    int main(void)
    {
    
        char str1[NUM] = {'L', 'L', 'L', 'L', 'L'};		//使用特定字符填充缓冲区
    	
    	//第一次读取
    	printf("第一次读取\n");
        gets(str1);
    	printf("len1 = %d str1 = %s\n", (int)strlen(str1) ,str1);
    
    	if((int)strlen(str1) + 1 > NUM)		//加 1 的目的是把 null字节输出出来
    	{
    		for(int i=0; i<(int)strlen(str1) + 1; i++)	//加 1 的目的是把 null字节输出出来
    		{
    
    			if(str1[i] == '\0')			
    				printf("str1[%d]    %d    %s\n", i, (int)str1[i],  "null");		//null字节
    			else if(str1[i] == '\n')
    				printf("str1[%d]    %d    %s\n", i, (int)str1[i],  "\\n");		//换行符
    			else
    				printf("str1[%d]    %d    %c\n", i, (int)str1[i],  str1[i]);
    			
    		}
    	}
    	else	//输入字节数小于 5
    	{
    		for(int i=0; i<NUM; i++)
    		{
    
    			if(str1[i] == '\0')			
    				printf("str1[%d]    %d    %s\n", i, (int)str1[i],  "null");		//null字节
    			else if(str1[i] == '\n')
    				printf("str1[%d]    %d    %s\n", i, (int)str1[i],  "\\n");		//换行符
    			else
    				printf("str1[%d]    %d    %c\n", i, (int)str1[i],  str1[i]);
    			
    		}
    	}
        return 0;
    }
    
    

    运行程序,输入 "aaa",结果如下:

    在Linux上运行会报错(包含了头文件,不知道为什么),看结果,我们输入小于NUM个字节,gets函数以回车结束,但是我们发现并没有 \n ,是因为,\n 被 null字节替换了。

    运行程序,输入“aaaaa”,结果如下:

    这个时候已经越界了,神奇的是并没有报错。

    多输入点字符,运行结果如下

    这时已经出现段错误了。这个函数并不安全。

    5、总结

    fgets无论读取的字符数是否超过 size -1 ,我们都会以null字节结束,(null字节不一定是最后一个存储单元),一次读取中有没有 \n 就不一定了。如果总是使用fgets ,那么就会熟知在每行终止处我们必须自己处理换行符 。

    gets函数并不会检查输入长度,所以存在危险,不要使用了最好。

     

     

    展开全文
  • 每当讨论 gets 函数时,大家不由自主地就会想起 1988 年的“互联网蠕虫”,...不仅如此,GCC 也不推荐使用gets和puts函数。那么,究竟是什么原因导致 gets 函数这么不招人待见呢?正确的语句是d (int)k%m28. 不能进...

    b561788dffd221f21578d62f912727ab.png

    每当讨论 gets 函数时,大家不由自主地就会想起 1988 年的“互联网蠕虫”,它在 UNIX 操作系统的 finger 后台程序中使用一个 gets 调用作为它的攻击方式之一。很显然,对蠕虫病毒的实现来说, gets 函数的功劳不可小视。不仅如此,GCC 也不推荐使用gets和puts函数。

    那么,究竟是什么原因导致 gets 函数这么不招人待见呢?

    正确的语句是d (int)k%m28. 不能进行++和--运算的数据类型为d 指针b)整型c) 长整型d) 常量 name:29. putchar函数可以向终端输出一个d 整型变量表达式b)实型变量值 字符串d)字符或字符型变量值 30. printf函数中用到格式符%5s,其中数字5表示输出的字 符串占用5列。gets函数功能:从键盘上输入字符,直至接受到换行符或eof时停止,并将读取的结果存放在buffer指针所指向的字符数组中。这次我输入了zhang和回车换行,fgets函数依然是读取5个字符(len-1个),这时fgets()读入zhang,已经是五个字符了,所以回车换行并不会读入,最后fgets()添加字符串结束标志'\0',所以我们看到输出时,press any...并没有换行输出,而是和zhang在同一行。

    4bf8a58db4da482f552000a3.gif

    该函数为在栈中分配size个字节的内存空间, 函数返回时会自动释放该空间. 成功返回指针, 失败返回null.。定义目录结构信息结构体dirent对象指针pdirent,之后通过一个while循环,该循环内通过调用readdir函数,以读取打开的目录对应的操作返回结果判断为条件。首先,next是一个指针,它指向一个函数,该函数返回另一个指针,该指针指向一个类型为char的常量指针,或者说next是一个指向函数的指针,该函数返回另一个指针,该指针指向一个只读的指向char的指针。

    如果函数的调用者提供了一个指向堆栈的指针,并且 gets 函数读入的字符数量超过了缓冲区的空间(即发生溢出),gets 函数会将多出来的字符继续写入堆栈中,这样就覆盖了堆栈中原来的内容,破坏一个或多个不相关变量的值。如下面的示例代码所示:

    int main(void)

    {

    char buffer[11];

    gets(buffer);

    printf("输出: %s\n",buffer);

    return 0;

    }示例代码的运行结果为:

    f6a2d8c327322b0c6714682c8e59d9d1.png

    aaa

    输出: aaa

    根据运行结果,当用户在键盘上输入的字符个数大于缓冲区 buffer 的最大界限时,gets 函数也不会对其进行任何检查,因此我们可以将恶意代码多出来的数据写入堆栈。由此可见,gets 函数是极其不安全的,可能成为病毒的入口,因为 gets 函数没有限制输入的字符串长度。所以我们应该使用 fgets 函数来替换 gets 函数,实际上这也是大多程序员所推荐的做法。

    1ddac4e1f3a0a16b740dcc969d96ed22.png

    相对于 gets 函数,fgets 函数最大的改进就是能够读取指定大小的数据,从而避免 gets 函数从 stdin 接收字符串而不检查它所复制的缓冲区空间大小导致的缓存溢出问题。当然,fgets 函数主要是为文件 I/O 而设计的(注意,不能用 fgets 函数读取二进制文件,因为 fgets 函数会把二进制文件当成文本文件来处理,这势必会产生乱码等不必要的麻烦)。其中,fgets 函数的原型如下:

    fgets函数功能:从文件指针stream中读取字符,存到以s为起始地址的空间里,知道读完n-1个字符,或者读完一行。函数说明 fgets()用来从参数stream所指的文件内读入字符并存到参数s所指的内存空间,直到出现换行字符、读到文件尾或是已读了size-1个字符为止,最后会加上null作为字符串结束。空语句和复合语句27413.3.2控制语句27513.3.3跳转语句27613.3.4关于分号的说明276习题13276第14单元函数28014.1函数参数28014.1.1现代c语言函数参数不能空28014.1.2c语言函数调用中的值结合28014.1.3指针类型参数28214.2函数定义与函数声明28914.2.1函数定义28914.2.2函数声明29014.3内联函数29114.3.1内联函数的概念29114.3.2c99的内联函数定义29114.3.3gcc的内联函数定义29214.3.4内联函数的限制292习题14292第15单元输入/输出29715.1格式化输出函数printf29715.1.1printf格式参数结构29715.1.2printf基本格式符29715.1.3长度修饰符29815.1.4域宽与精度说明29915.1.5前缀修饰符29915.2格式化输入函数scanf30115.2.1scanf指针参数30115.2.2scanf格式参数结构30215.2.3数值数据的输入控制30415.2.4scanf与输入缓冲区30515.2.5字符型数据的输入控制30615.2.6scanf的停止与返回30915.3c语言的文件操作31015.3.1文件及其分类31015.3.2file类型及其指针31215.3.3c语言文件操作的一般过程31315.3.4文件操作程序示例316习题15318附录324附录ac语言关键字324附录bc语言运算符的优先级和结合方向324附录c编译预处理命令325c.1宏定义325c.2文件包含326c.3条件编译326附录dc标准库头文件326附录ec语言常用标准库函数327e.1数学函数327e.2字符函数和字符串函数328e.3输入/输出函数329e.4动态内存分配函数331e.5退出程序函数331e.6数值转换函数331e.7时间和日期函数332参考文献333。

    与 gets 函数不同的是,如果 fgets 函数读到换行符,就会把它存储到字符串中,而不是像 gets 函数那样丢弃它。即给定参数 n,fgets 函数只能读取 n-1 个字符(包括换行符)。如果有一行超过 n-1 个字符,那么 fgets 函数将返回一个不完整的行(只读取该行的前 n-1 个字符)。但是,缓冲区总是以 null('\0') 字符结尾,对 fgets 函数的下一次调用会继续读取该行fgets读取一行。

    0_1286093885j2Ur.gif

    字符数组中一个元素只能存放一个字符,如 char a:表示定义了一个一维字符数组a,可存放5个字符,或存放最大长度为4的1个字符串(最后一个字符是字符串结束符‘\0’)。也就是说,后续的getchat()调用不会等待用户按键,而是直接读取缓冲区中的字符,直到缓冲区的字符读取完毕后,才等待用户按键。这里情况比较复杂的是scanf()函数,如果是scanf("%d",&a),它会忽略输入的空白符(换行,制表,空格)直到遇见非空白字符,再将其转换成整型存储在a中,注意,由于i/o缓冲,用来刷新输入缓冲的换行符还在等待被输入接受,此时能用getchar()捕获,但是在非空字符前面被忽略的空白符却因为被scanf()丢弃,已经不存在了。

    最后,它还需要第 3 个参数来说明读取哪个文件。如果是从键盘上读入数据,可以使用 stdin 作为该参数,如下面的代码所示:

    int main(void)

    {

    char buffer[11];

    fgets(buffer,11,stdin);

    printf("输出: %s\n",buffer);

    return 0;

    }对于上面的示例代码,如果输入的字符串小于或等于 10 个字符,那么程序将完整地输出结果;如果输入的字符串大于 10 个字符,那么程序将截断输入的字符串,最后只输出前 10 个字符。示例代码运行结果为:

    aaaaaaaaaaaaaaaa

    输出: aaaaaaaaaa

    除此之外,C99 还提供了 fgets 函数的宽字符版本 fgetws 函数,其函数的一般原型如下面的代码所示:

    该函数的功能与 fgets 函数一样。

    本文来自电脑杂谈,转载请注明本文网址:

    http://www.pc-fly.com/a/jisuanjixue/article-101477-1.html

    展开全文
  • fgets和gets区别

    万次阅读 多人点赞 2012-09-07 12:36:01
    在编程中发现gets和fgets一些区别总结一下; 1、 fgetsgets安全,使用gets编译时会警告 为了安全,gets少用,因为其没有指定输入字符的大小,限制输入缓冲区得大小,如果输入的字符大于定义的数组长度,...

    在编程中发现getsfgets一些区别总结一下;

    1、 fgetsgets安全,使用gets编译时会警告


    为了安全,gets少用,因为其没有指定输入字符的大小,限制输入缓冲区得大小,如果输入的字符大于定义的数组长度,会发生内存越界,堆栈溢出。后果非常怕怕

     fgets会指定大小,如果超出数组大小,会自动根据定义数组的长度截断。(redhat9.0实验并不是如此,不知为何,照样能输出)

    2、 用strlen检测两者的输入的字符串长度,结果不一样

    gets:


    fgets:


    可以看到,同样是输入123

    gets只有一次换行,这是因为程序的语句printf(“%s\n”,str)

    fgets有两次,而第二次是其本身把回车换行符存入了字符串里

    所以,gets的长度只有3和输入的字符串长度一样,fgets4,多出来的是回车换行符。

    具体的介绍:

    fgets函数fgets函数用来从文件中读入字符串。fgets函数的调用形式如下:fgetsstrnfp);此处,fp是文件指针;str是存放在字符串的起始地址;n是一个int类型变量。函数的功能是从fp所指文件中读入n-1个字符放入str为起始地址的空间内;如果在未读满n-1个字符之时,已读到一个换行符或一个EOF(文件结束标志),则结束本次读操作,读入的字符串中最后包含读到的换行符。因此,确切地说,调用fgets函数时,最多只能读入n-1个字符。读入结束后,系统将自动在最后加'\0',并以str作为函数值返回。

    gets()将删除新行符, fgets()则保留新行符.

    要去掉fgets()最后带的“\0",只要用 s[strlen(s)-1]='\0';即可。

    fgets不会像gets那样自动地去掉结尾的\n,所以程序中手动将\n位置处的值变为\0,代表输入的结束。

    针对于fgets,还要再说两句,下面这种用法,是安全的判断文件读取结束或者出错的好方式,切忌不能使用while(!feof(fp)) ,还有对于fgets的第二个参数是最大能读取文件字符的个数,一般最大的长度是1024字节。

    while(fgets(..., stream)){

            /* ... */

    }

    if(ferror(stream)){

            /* ... */

    }

    展开全文
  • gets,fgets,gets_s的区别分析

    千次阅读 2020-08-07 15:48:45
    在最开始学习字符串时,我们最常用的输入字符串函数就是——gets(); 这个函数将输入缓冲区中的数据存储到字符型数组中,以换行符结束,并丢弃末尾的换行符添加一个空字符。他解决了scanf("%s",str);以空白符为截至的...

    在最开始学习字符串时,我们最常用的输入字符串函数就是——gets();
    这个函数将输入缓冲区中的数据存储到字符型数组中,以换行符结束,并丢弃末尾的换行符添加一个空字符。他解决了scanf("%s",str);以空白符为截至的漏洞。
    但是这个函数有一个致命的弱点——不能对数组溢出做出相应的处理

    我们都知道,在我们定义数组时先要确定数组的大小,系统会分配一段没被使用的连续空间给这个数组。在这片区域外,我们不知道其他的空间是否被使用,这就带来了一个问题——如果数组越界时,会存在安全隐患,但是gets函数并没有处理这种越界问题的机制。
    比如:

    #include<stdio.h>
    int main()
    {
            char ch[10];
            gets(ch);
            puts(ch);
            return 0;
    }
    
    

    在这里插入图片描述
    这是一个简单的输入输出代码,但是我们在一开始定义数组时只分配了10个存储空间,而我往输入缓存区中输入了超过10的数据,gets函数将换行符之前的数据全都存进了ch数组。
    众所周知,ch实际就是ch数组的头指针,gets从ch的头地址依次按内存顺序存入数据,这本身并没有问题,但是我们在定义数组ch时只关心ch可不可以存入10个数据,这10个数据之外的地方有没有存数据我们是不知道的。
    如果凑巧,没有存入数据,这并没有关系;但如果存入了,就会将原来的数据覆盖。这会导致很大的安全隐患。而gets函数并没有检查是否存在这种数组越界。
    由此诞生了gets的替代品。

    替代品1:fgets()

    特点一:指定读入的字符个数

    fgets函数并不像gets那样只能从标准中读取数据,他更常用在读取文件中的数据。
    fgets()需要传入三个参数,依次是要读入的对象,读入字符的最大数量,要读入的文件。
    如果是要在标准输入中读入,将第三个参数设置为stdin(在stdio.h)中。
    示例如:

    #include<stdio.h>
    int main()
    {
            char ch[10];
            fgets(ch,10,stdin);
            fputs(ch,stdout);        // 与fgets配套的输出函数
            return 0;
    }
    
    

    在这里插入图片描述
    输出结果显示,fgets函数只会将第二个参数指定大小的字符读入字符数组中(包括换行符)。如果输入不足10就输入换行符,则将字符包括换行符读入字符数组中。

    特点二:不会将字符串末尾的换行符丢弃再添一个空字符

    #include<stdio.h>
    int main()
    {
            char ch[10];
            fgets(ch,10,stdin);
            fputs(ch,stdout);
            return 0;
    }
    
    

    在这里插入图片描述
    还是输入输出的程序,这次我们输入的字符数小于可读入的最大字符数。我们依次输入了 ‘a’,‘b’,‘c’,’\n’ ,fgets将这四个字符都读入到了数组ch中,与gets有区别的是,他没有将末尾的换行符丢弃并添加一个空字符 ‘\0’ ,而是直接将末尾的换行符保留下来了。
    如果要将换行符换成空字符,需人为进行操作。
    操作如下(将 ‘\n’ 换成 ‘\0’ ):

    #include<stdio.h>
    int main()
    {
            char ch[10];
            fgets(ch,10,stdin);
            
            // 将 '\n' 换成 '\0'
            int i = 0;
            while(ch[i] != '\n')
                    i++;
            ch[i] = '\0';
            
    
            fputs(ch,stdout);
            return 0;
    }
    
    

    在这里插入图片描述
    上述代码中我们将末尾的 ‘\n’ 换成了 ‘\0’ ,输出数组ch时,没有再输出一个换行符。

    特点三:保留多余字符

    通过之前的例子我们已经知道,fgets函数最多只会读入指定的字符数,那那些没有读入的字符会何去何从呢?
    先看下面的例子:

    #include<stdio.h>
    int main()
    {
            char ch[10],sh[10],dh;
            // 输入
            fgets(ch,10,stdin);
            fgets(sh,10,stdin);
            dh = getchar();
    
            // 输出
            fputs(ch,stdout);
            putchar('\n');             // 分割 ch 和 sh
            fputs(sh,stdout);
            putchar('\n');             // 分割 sh 和 dh
            putchar(dh);
            return 0;
    }
    
    

    在这里插入图片描述
    我们先输入了一句话 “i will ba a niubide girl” 。头10个字符是 “i will ba”,fgets将他读入到数组ch中。紧接着的10个字符 “ a niubid” ,fgets将他读入到数组sh中,后面的 ‘e’ 读入到 dh 中。后面的字符 “ girl” 我相信他也没用被丢弃,而是还在输入缓存区中。由此我们看出,fgets并没有将没有读入的数据丢弃,他们依然在输入缓存区中等待着之后的数据的读取。
    有时你想将之后的数据进行丢弃。如下操作:

    #include<stdio.h>
    int main()
    {
            char ch[10],sh[10];
            fgets(ch,10,stdin);
    
           // 丢弃数据
            while(getchar() != '\n')
                    continue;
    
            // 丢弃数据后再读入一个数据
            fgets(sh,10,stdin);
    
            // 输出两个数组
            fputs(ch,stdout);
            putchar('\n');              // 分割 ch 和 sh
            fputs(sh,stdout);
            return 0;
    }
    
    

    在这里插入图片描述
    提醒:最后一行的换行是因为 sh 保留了换行符,再进行输出得来的。

    替代品二:gets_s()

    特点一:丢弃换行符而不是保存他

    对于末尾换行符的处理,在不超过数组范围时 gets_s 丢弃他而不是保存他,这点和 gets 一样和 fgets 不一样。

    特点二:将多余的字符丢弃

    当我们向输入缓存区中输入多于数组的字符数时,gets_s会将多余的字符丢弃以达到避免存在安全隐患的目的,不论你是否需要后面的字符。

    .
    .
    .
    .
    .

    比较三个函数:

    情况一:目标存储区装得下输入行

    这时三种情况都差不太多,有区别的是 gets 和 gets_s 会丢弃 ‘\n’ 添加一个 ‘\0’ ,而 fgets会保留末尾的换行符。

    情况二:目标存储区装不下输入行

    gets 会将数据全都读入数组,从数组的头地址开始依次读入。若越界后有数据则会覆盖原始 数据,从而存在安全隐患。
    fgets 只读入指定的数据大小,剩下的数据依然在输入缓冲区中。
    gets_s 只读入数组最大可读大小,剩下的数据全部丢弃。

    欢迎大家指正和补充。

    展开全文
  • fgets和gets函数的区别

    2017-04-27 17:25:59
    1. getsfgets  gets函数原型:char*gets(char*buffer);//读取字符到数组:gets(str);str为数组名。  gets函数功能:从键盘上输入字符,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的...
  • fgets替代gets

    2019-01-01 20:58:31
    改用 fgets fputs #include &amp;amp;amp;lt;cstdio&amp;amp;amp;gt; #include &amp;amp;amp;lt;cstring&amp;amp;amp;gt; #include &amp;amp;amp;lt;iostream&amp;amp;amp;gt; using...
  • fgets和gets

    2020-12-17 22:27:39
    今天发现一个之前都没注意gets和fgets的重大区别 下面这两个代码效果是一样的 在这里区分一下gets和fgets fgets读的代码多个\n,就是巴拉巴拉\n\0 gets是巴拉巴拉\0 C 库函数 char *fgets(char *str, int n, FILE...
  • 1. getsfgets  gets函数原型:char*gets(char*buffer);//读取字符到数组:gets(str);str为数组名。  gets函数功能:从键盘上输入字符,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的...
  • fgets 和gets 介绍 (Introduction) We all are familiar with the scanf() function. It is the main function applicable to take basic user inputs. Even though scanf() works great while taking inputs such ...
  • fgets和fscanf区别

    万次阅读 多人点赞 2016-08-10 13:37:42
    一、作用上的大概区别:①fgets:从文件中读取一行数据存入缓冲区(fgets遇到回车才会结束,不对空格回车做任何转换就录入到缓冲区,结束后再往缓冲区写多一个\0,所以它是读一行数据)②fscanf:从文件中读取一段...
  • 函数名:fgets  功能:从流中读取一个字符串  用法:char *fgets(char *string,int n,FILE *stream);  形参注释:  *string:结果数据的首地址;n-1:读入数据块的长度,其默认值为1k,即1024;stream文件...
  • char buf[32] = {0}; gets(buf); //相当于 fgets(buf,sizeof(buf),stdin); if(buf[strlen(buf)-1] == '\n'){ buf[strlen(buf)-1] = '\0'; }
  • 搜索热词前言大家都知道在C语言中,有三种主要的输入函数:scanf(),fgets()以及gets()。他们的使用方法及注意事项如下:1.scanf()它是一种格式化的输入方式,可一次性按照规定的格式输入多个数据域。scanf函数是一个...
  • getsfgets区别

    2018-11-17 20:06:57
    gets——从标准输入接收一串字符,遇到’\n’时结束,但不接收’\n’,把 ‘\n’留存输入缓冲区;把接收的一串字符存储在形式参数指针指向的空间,并在最后自动添加一个’\0’。 getchar——从标准输入接收一个字符...
  • fgets函数与gets函数

    2021-09-19 09:31:07
    可见fgets要传入参数n,即读入多少个字符,而gets并没有这个限制。在这里显而易见,fgets读入多少字符我们自己传参,不会造成越界的问题。但是gets会把我们给的字符一直向数组s中读入,很容易产生越界问题。 fgets...
  • gets——从标准输入接收一串字符,遇到'\n'时结束,但不接收'\n',把 '\n'留存输入缓冲区;把接收的一串字符存储在形式参数指针指向的空间,并在最后自动添加一个'\0'。getchar——从标准输入接收一个字符返回,多余...
  • 函数名:fgets  功能:从流中读取一个字符串  用法:char *fgets(char *string,int n,FILE *stream);  形参注释:  *string:结果数据的首地址;n-1:一次读入数据块的长度,其默认值为1k,即1024;stream...
  • gets(s[i]); if(s[i][0]=='#') break; } n=i; for(i=0;i<n;i++){ t=0; for(j=0;j<strlen(s[i]);j++) if(s[i][j]==32) t=t; else...
  • fgets()与gets()的区别

    2015-08-25 22:21:11
    gets和fgets一些区别总结一下   1、fgets()比gets()安全  为了安全,gets()少用,因为其没有指定输入字符的大小,限制输入缓冲区得大小,如果输入的字符大于定义的数组长度,会发生内存越界,堆栈溢出。fgets()...
  • getchar、fgetsgets和scanf的区别 getchar() getchar函数只能接受单个字符,输入数字也按照字符处理。输入多个字符时,只接受第一个字符。 gets() 从stdin流中读取字符串,直至遇到’\n’或者EOF停止读取,并将...
  • 在c语言中读取字符串有多种方法,比如scanf() 配合%s使用,但是这种方法只能...gets()函数经常puts()函数配对使用,puts()函数用于显示字符串,并自动在字符串后面添加一个换行标志’\n’ gets()函数存在一个严重的缺
  • 满意答案wkmpbg846推荐于 2018.02.27采纳率:45%等级:8已帮助:362人gets():原型:char *gets(char *buffer) ;功能:从stdlin中获取获取字符串一直到换行符或者遇到EOF为止,但换行符不被录取,会将换行符替换成‘\0...
  • fgetsgets区别

    2021-12-10 22:44:33
    1、 fgetsgets安全,使用gets编译时会警告 为了安全,gets少用,因为其没有指定输入字符的大小,限制输入缓冲区得大小,如果输入的字符大于定义的数组长度,会发生内存越界,堆栈溢出。后果非常怕怕 fgets会指定...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,075
精华内容 4,830
关键字:

fgets和gets的区别