精华内容
下载资源
问答
  • gets_s函数头文件
    2021-05-21 14:32:28

    最近做游戏编辑器,自己试着用C/C++写了一个读取简单配置表的函数,在控制台下测试的时候,使用了C的标准库gets函数,发现编译器报告gets函数unsafe,网上搜索了一下,发现gets函数不对接受字符串的buffer进行边界检测,会造成越界,从而产生bug;自己写的东西,也是自己用的东西,当然可以在定义配置表的时候得到控制,从而不会使越界的情况出现,但是总的来说这不是一个好的思考方式;于是按照网上的提示改用了fgets函数替代;

    使用fgets函数后,就发现问题了,原来的代码不能正常工作了,调试了一通,发现使用fgets函数获取的字符串与gets函数获取的不一样,fgets函数获取的字符串会在buffer里面保留换行符,而gets函数不会;好吧,问题找到了,解决也很简单,把最后一个换行符拿掉,换成'\0'就可以了。然后,又发现有个gets_s函数,可以像gets一样不会获取换行符,也不会有gets的越界问题,然后在cppreference.com查看了这几个函数的描述,却发现gets_s函数是一个标准库扩展函数,一个可选项;所以就不知道这个gets_s函数在各个编译器下的支持情况如何!作罢,还是使用fgets函数吧。

    这里所引起的思考是:很多的库函数都有着一些很细节的限制,而它的reference一般都会有详细的描述,这就得在使用库函数时去详细的了解库的条件和限制,以免因对库的片面理解,而造成bug.

    更多相关内容
  • 使用C语言gets函数和gets_s函数,读取含空格的字符串

    导读

     在刷Oj题时,遇到包含空格的字符串输入,如何读取呢?如果使用scanf%s格式去读取输入的字符串,遇到空格就读取结束了,显然这样是读取不了的。当然,scanf也是可以读取含空格字符串的,但操作起来相对较难,对C语言初学者并不友好。下面开始介绍两个可以对含空格字符串读取的库函数------getsgets_s函数


    gets函数

    函数声明

    char * gets ( char * str );
    

    函数介绍

    头文件

    #include<stdio.h>

    从stdin获取字符串

    从标准输入(stdin)中读取字符(包括空格,Tab),并将其作为C字符串存储到str中,直到到达换行符或文件结尾。

    如果找到换行符,则不会将其复制到str中。

    在复制到str的字符之后,将自动追加终止的空字符

    请注意getsfgets完全不同:gets不仅使用stdin作为源,而且在结果字符串中不包含结尾的换行符,并且不允许指定str的最大大小(这可能导致缓冲区溢出

    参数

    str

    指向内存块(字符数组)的char*型指针,其中读取的字符串作为C字符串复制。

    返回值

    成功时,函数返回str(返回输入字符串的起始位置)

    读取结束(读取到'\n')或读取失败时,函数返回空指针(NULL)。

    以下两行了解即可

    如果在尝试读取字符时遇到文件结尾,则设置EOF指示符(FEOF)。如果在读取任何字符之前发生这种情况,则返回的指针为空指针(NULL)(str的内容保持不变)。

    如果发生读取错误,将设置错误指示符(ferror),并返回空指针(NULL)(但str指向的内容可能已更改)。

    兼容性

    C标准的最新修订版(2011年)已明确将该功能从其规范中删除。

    该函数在C++中被禁止(如2011个标准,它遵循C9+TC3)。


    用法实例(在DEV-C++编译器环境底下,Visual Studio 2019并不支持gets函数)

    eg1:多组输入含空格字符串,输出其字符串长度和字符串

    #include<stdio.h>
    #include<string.h>
    
    int main()
    {
    	char str[100] = { 0 };
    	int len=0;
    	while(gets(str) != NULL)	//gets函数的多组输入写法,读取结束或失败时返回NULL,注意和scanf函数的多组输入结束或失败返回值EOF区分开 
    	{
    		len = strlen(str);
    		printf("输入的字符串%s长度是%d\n", str, len);
    	}
    	
    	return 0;
    }

    eg2:使用动态内存分配函数返回的指针接收输入的含空格的字符串

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    int main()
    {
    	char* str = (char*)calloc(100, sizeof(char));
    	//char* str = (char*)malloc(100 * sizeof(char));
    	int len=0;
    	
    	if(str != NULL)
    	{
    		while(gets(str) != NULL)	//gets函数的多组输入写法,读取结束或失败时返回NULL,注意和scanf函数的多组输入结束或失败返回值EOF区分开 
    		{
    			len = strlen(str);
    			printf("输入的字符串%s长度是%d\n", str, len);
    		}
    
    		
    		free(str);
    		str=NULL;
    	}
    
    	return 0;
    }

    eg3:由于目标指针str不允许指定str的最大大小(这里指内存空间大小)(这可能导致缓冲区溢出

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    
    int main()
    {
    	char str[3] = { 0 };//创建可以存放三个字符的数组 
    	int len=0;
    	//输入字符串abcdef(超过str数组长度) 这种情况下的输出依然可以得到期望的值。
        //但是,这也体现了gets函数在某些情况下可能会导致缓冲区溢出,这是一个不安全的函数 
    	while(gets(str) != NULL)	//gets函数的多组输入写法,读取结束或失败时返回NULL,注意和scanf函数的多组输入结束或失败返回值EOF区分开 
    	{
    		len = strlen(str);
    		printf("输入的字符串%s长度是%d\n", str, len);
    	}
    	
    	return 0;
    }

    gets_s函数

    函数声明

    char * gets_s( char * buffer,  size_t  sizeInCharacters );


    函数介绍

    头文件

    #include<stdio.h>

    参数

    buffer
    输入字符串的存储位置,char*型指针。

    sizeInCharacters
    缓冲区的大小。

    返回值

    如果成功,则返回 buffer。 NULL 指针指示错误或文件尾条件。 使用 ferror 或 feof 来确定发生了哪一个。

    注解

    gets_s 函数从标准输入流 stdin 中读取一个行并将该行存储在 buffer中。 该行由所有字符组成,其中包含第一个换行符 ( " \n " ) 。 gets_s 然后,在返回行之前将换行符替换为空字符 ( " \0 " ) 。 相反, fgets_s 函数将保留换行符。

    如果读取的第一个字符是文件尾字符,则空字符将存储在 buffer 的开头,并返回 NULL

    _getws_s 是 gets_s 的宽字符版本;其参数和返回值都是宽字符字符串。

    如果 buffer 为 NULL 或 sizeInCharacters 小于或等于零,或者如果缓冲区太小,无法包含输入行和 null 终止符(小写的null空字符 ( " \0 " )),这些函数将调用无效参数处理程序,如buffer中所述。 如果允许执行继续,则这些函数返回 NULL 并将 errno 设置为 ERANGE

    以下两行了解即可

    在 C++ 中,使用这些函数由模板重载简化;重载可以自动推导出缓冲区长度 (不再需要指定大小自变量),并且它们可以自动用以更新、更安全的对应物替换旧的、不安全的函数。 有关详细信息,请参阅安全模板重载

    默认情况下,此函数的全局状态的作用域限定为应用程序。 若要更改此项,请参阅 CRT 中的全局状态


    用法实例(由于gets_s是Visual Studio 编译器提供的安全gets函数,因此仅在该编译器环境底下可以使用)

    eg1:多组输入,多组输出,求含空格字符串长度,以char类型型数组存放

    #include<stdio.h>
    #include<string.h>
    
    #define SZ 10  //根据实际输入情况定义最长字符串长度+1即可,增加1是为了给'\0'留位置,这里最长可输入9长度的字符串
    
    int main()
    {
        int len = 0;
        char str[SZ] = { 0 };
    
        while (gets_s(str, SZ) != NULL)//这里只能输入不超过SZ-1长度的字符串,否则程序崩溃,这也体现出gets_s函数的安全性极高
        {
            len = strlen(str);
            printf("输入的字符串%s长度为%d", str, len);
        }
    
        return 0;
    }

    eg2:多组输入,多组输出,输入处理含空格的字符串,以动态内存分配函数形式

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    #define SZ 10  //根据实际输入情况定义最长字符串长度+1即可,增加1是为了给'\0'留位置,这里最长可输入9长度的字符串
    
    int main()
    {
        int len = 0;
        char* str = (char*)malloc(SZ * sizeof(char));
       // char* str = (char*)calloc(SZ, sizeof(char));
    
        while (gets_s(str, SZ) != NULL)//这里只能输入不超过SZ-1长度的字符串,否则程序崩溃,这也体现出gets_s函数的安全性极高
        {
            len = strlen(str);
            printf("输入的字符串%s长度为%d", str, len);
        }
    
        free(str);
        str=NULL;
    
        return 0;
    }

     学习小结

    这两个函数给我们提供了一种新的读取字符串的方式,与scanf函数读取字符串的区别就在于它们可以读取含空格,Tab的字符串。解决关于字符串OJ问题的关键一步,读取输入的字符串就得到有效的解决了。

    在DEV-C++编译器环境底下,直接调用gets函数即可;在Visual Studio 2019等VS编译器底下,gets函数被gets_s函数取代,调用gets_s函数即可。

    这两个函数,注意传递的参数,在提交到OJ系统上时,应该使用gets函数,因为OJ系统上的编译环境其实是DEV。


    给大家西大OJ上的一道处理含空格字符串的题目,OJ练习:OnlineJudge

    西大OJ时常会出现崩溃情况,我还是把题目放底下给大家吧。


     题外话

    今天是2021年12月18日,是的,今天是英语四六级考试。我已经寄了,只能明年继续冲了,在这里记录一下今天,这是一个悲伤的故事。

    上午11:20考完试,我就回宿舍做上面那道OJ题。17日的晚上,我做到这道题目时,挨卡了,以前处理字符串的题目是不包含空格的,因此我也是查了很多的资料,但是发现,CSDN上关于处理含字符串函数的介绍并不理想,因此,在我AC这个题目后,我进行了这次学习总结。

    查了很多种处理含空格字符串处理方法,最终我选择介绍gets和gets_s函数,这对于C语言初学者来说,是比较好理解和操作的,上面的介绍中也对函数的使用给了具体的例子。

    这篇博客,干货多多,建议一键三连,同时希望它可以帮助到C语言初学者。

    展开全文
  • 在C++读取一行字符串时,可以用函数getline 和 gets,在VC++2010,gets可以使用,但是在VS2019中,需要用到更安全的函数gets_s。 在使用gets_s时,只需要一个参数,用char数组存储的字符串,也就是C语言的字符串存储...

    读取一行,直到遇到回车符。
    在C++读取一行字符串时,可以用函数getline 和 gets,在VC++2010,gets可以使用,但是在VS2019中,需要用到更安全的函数gets_s。

    1.在使用gets_s时,只需要一个参数,用char数组存储的字符串,也就是C语言的字符串存储方式。例:gets_s(addr);。C语言存储字符串char数组需要用到头文件#include<string.h>

    2.在使用getline函数时,需要用到2个参数:C++标准输入设备cin,C++专门存储字符串的string类型,存储的字符串变量(addr1)。C++存储字符串变量string类型需要用到头文件#include。例:getline(cin, addr1);

    3.用cin.get(addr, sizeof(addr));也可以达到读取一行的效果。它需要2个参数:用C语言方式char数组存储的字符串变量(addr),以及计算该字符串长度的sizeof(addr))。方式。

    #include<iostream>
    #include<Windows.h>
    #include<stdio.h>
    #include<string.h>
    #include<string>
    
    using namespace std;
    
    int main(void) {
    	sring addr1;
    	char name[32];
    	char addr[32];
    
    	printf_s("姑娘芳名?\n");
    	//输入  小芳\n ->输入缓冲区: 小芳\n  ->\n
    	scanf_s("%s\n", name,sizeof(name));
    	fflus(stdin);//清空输入缓冲区
    
    	printf_s("%s姑娘,家住何方?\n",name);
    
    	//gets(addr); vc++2010支持,vs2019不支持
    	gets_s(addr);//读一行,直到遇到回车符
    	//cin.get(addr, sizeof(addr));//char
    	//getline(cin, addr1);//string
    
    	printf_s("家住%s的%s姑娘,我中意你哦!",   addr,name);
    
    	system("pause");
    	return 0;
    }
    
    展开全文
  • C语言gets_s, _getws_s函数了解

    万次阅读 多人点赞 2012-12-11 16:18:55
    gets_s 对应头文件 _getws_s对应头文件 or 原型: char *gets_s(char *buffer,size_t sizeInCharacters); wchar_t *_getws_s(wchar_t *buffer,size_t sizeInCharacters); 与gets函数类似。 _getws ...
    gets_s  对应头文件<stdio.h>

    _getws_s对应头文件<stdio.h> or <wchar.h>


    原型:

    char *gets_s(char *buffer,size_t sizeInCharacters);

    wchar_t *_getws_s(wchar_t *buffer,size_t sizeInCharacters);

    与gets函数类似。

    _getws is a wide-character version of gets_s; its argument and return value are wide-character strings.

    【FROM CSDN】

    调用:

    gets(buffer) //函数对输入长度不加以限制    //所以在vs中用gets会有警告信息This function or variable may be unsafe.
    gets_s(buffer,size)  //其中第二参数就是允许的输入长度     //这里的size是分配buffer-1的长度才正好,否则自动为'\0'分配空间的时候会溢出。

    看下面这段代码:

    #include <stdio.h>
    int main(void)
    {
    	char buffer[21];   //20 chars + '\0'
    	gets_s(buffer,20);  //写成21后,当输入21个字符回车之后,自动添加的'\0',会要求分配存储空间的
    	printf("Your input was %s\n",buffer);
    	system("pause");
    	return 0;
    }





    展开全文
  • string函数头文件

    千次阅读 2021-05-23 01:47:01
    string.h头文件中有什么函数string.h头文件中的函数:#include //STL 通用算法#include //STL 位集容器#include //复数类#include //STL双端队列容器#include //异常处理类#include //STL 线性列表容器 7、#include ...
  • gets()、fgets()、gets_s()、s_gets()

    千次阅读 2020-09-10 10:40:13
    gets()、fgets()、gets_s()、s_gets() 1、gets()
  • _stprintf_s和_stscanf_s函数与UNICODE编码

    万次阅读 2014-05-06 10:03:22
    _stprintf_s和_stscanf_s函数与UNICODE编码  一、核心内容   该文档适用于微软的visual C++ 平台。  需要头文件:   MSDN上对stprintf_s和_stscanf_s函数的定义: TCHAR.H routine _UNICODE & _MBCS ...
  • gets()gets_s()puts()函数的使用

    万次阅读 2013-10-13 13:05:36
    从stdin流中读取字符串,直至接受到换行符或EOF时停止... gets 包含头文件  string.h  从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取
  • c++ gets函数

    千次阅读 2019-10-01 03:41:54
    函数名称:gets函数 函数结构:gets() 所需头文件:#include<cstdio> 函数作用:持续读入,直到遇到换行停止输出。 转载于:https://www.cnblogs.com/lipeiyi520/p/8439377.html...
  • C语言笔记——gets_s, fgets, puts函数

    千次阅读 2017-09-17 20:01:40
    1. gets_s——相当于scanf 用法: char ex[5]; gets_s(ex); 相当于 scanf("%s", ex); // 一旦输入超过4字节(末尾的'\0'占去1字节)就会出错 2. fgets是gets_s和scanf的改进。 用法: fgets(ex, 5, stdin); ...
  • gets_s(str); length = strlen(str); std::sort(str, str + length); puts(str); while (std::next_permutation(str, str + length)) { puts(str); } system("pause"); return 0; } #endif
  • C++中 gets()函数

    万次阅读 多人点赞 2016-09-19 00:03:24
    gets从标准输入设备读字符串函数。可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。 功能 编辑 从stdio流中读取字符串,直至接受到换行符...
  • C/C++头文件一览 C #include <assert.h> //设定插入点 #include <ctype.h> //字符处理 #include <errno.h> //定义错误码 #include <float.h> //浮点数处理 #include <iso646.h> //...
  • 你真的会用C语言的fscanf_s

    千次阅读 多人点赞 2021-06-21 12:53:49
    title: 你真的会用C语言的fscanf_s吗 date: 2021-06-21 00:28:05 1.前言 最近学校让做一个C语言工程实践,我写的是一个基于链表的图书管理系统,本来这个系统的难度不是很大,但是在写的过程中总是会出一些莫名奇妙...
  • #include<...//gets_s()用法:gets从标准输入设备读字符串函数。可以无限读取,不会判断上限,以回车结束读取 //getchar()函数以字符为单位对输入的数据进行读取。 void main(){ //1、输入一个字符...
  • gets()函数

    2022-06-27 14:22:30
    gets()函数
  • c语言中常用的函数头文件

    千次阅读 2021-05-21 10:14:51
    头文件ctype.h函数列表函数类别函数目的详细说明字符测试为字符和数字的isalnum是否为isalpha字符是否控制字符iscntrl是否为数字isdigit是否能够显示文字(空格除外) isgraph是否可以显示字符(包括空格) isprint非...
  • 列举了C/C++常用头文件函数,保存下来可以供随时查阅
  • ACM中gets函数用不了

    2022-03-26 17:25:10
    因为这个函数不安全,现代c++编译器里面都删除了这个函数,网络上的gets_s有在VS中才能使用。推荐使用fgets。 函数原型 char *fgets(char *str, int n, FILE *stream); 参数 str– 这是指向一个字符数组的指针,该...
  • 在VS2015中,使用gets()函数读取输入数据时,会显示“error C3861: “gets”: 找不到标识符”,即使程序中包含了stdio.h头文件。 1 gets()函数在VS2015中已过时 在MSDN中提到,在VS2015的CRT中已经不...
  • gets与puts函数

    2022-01-18 20:18:54
    原型:char *gets(char *s); 功能:从终端读取一个字符串 参数:s:保存读取的数据的内容,一般是一个数组 返回值:保存的字符串 例如: #include<stdio.h> int main() { char a[32] = {0};//定义的一...
  • cin: 标准的输入流,需要头文件iostream,只能输入连续的一个字符串,中间不能有空格,否则默认以空格为中断,将字符创分为n+1段(n等于空格数); gets() 是C语言的函数,需要头文件# ...gets_s() gets()可以无限读
  • C函数_filelength函数了解

    万次阅读 2012-12-14 12:29:51
    _filelength()---->Gets the length of a file. 原型: long _filelength(int fd ); __int64 _filelengthi64(int fd ); fd:Target the file descriptor. 取文件长度字节数. Both _filelength and ...
  • 在vs 2019版本中 如果使用 strcpy()与strcat() 都会警告大意说这个 strcpy()因为空间分配的 这个函数不安全 ...strcpy_s()老的 strcpy(D,S)就是把S数组复制给D,返回D。 但是S的空间比D大的话 这就会发生错误。这就是...
  • libc 常用头文件函数总结

    千次阅读 2020-02-18 21:50:51
    数学函数 math.h 信号处理 signal.h 输入输出 stdio.h 实用工具程序 stdlib.h 字符串处理 string.h string.h 本分类的函数用于对字符串进行合并、比较等操作 字符串拷贝 块拷贝(目的和源存储区不可重叠) ...
  • atoi函数(atoi函数在那个头文件)

    万次阅读 2021-05-25 03:16:05
    需要导入头文件#include 将字符串转换成一个整数并返回结果。参数str 以数字开头,当函数从str 中读到非数字字符则结束转换并将结果返回。例如, int i = atoi( .atoi(s.substr(0,4).c_str())是个什么意思?能具体...
  • 我在C11标准中看到了函数 gets_s,想在 DEV C++ 中用这个 gets_s 函数,但加了这个函数后,编译一直不成功,应该如何设置 DEV C?该使用哪个头文件(我现在用的是 stdio.h)?
  • gets和puts函数

    2021-10-30 17:11:33
    1.gets函数(只能读取字符串) scanf在读取字符串时,当遇到空格后,就会匹配结束,这样没办法把一行带有空格字符串存入到一个存入到一个字符数组,由此引出 gets 函数 当输入的字符串中存在空格时,需使用 gets ...
  • C/C++头文件一览 #include <assert.h> //设定插入点 #include <ctype.h> //字符处理 #include <errno.h> //定义错误码 #include <float.h> //浮点数处理 #include <iso646.h> //...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,662
精华内容 5,464
关键字:

gets_s函数头文件