精华内容
下载资源
问答
  • gets函数,C语言gets函数详解

    千次阅读 多人点赞 2021-03-01 21:41:14
    其实还有更简单的方法,即使用 gets() 函数。该函数的原型为: # include <stdio.h> char *gets(char *str); 这个函数很简单,只有一个参数。参数类型为 char* 型,即 str 可以是一个字符指针变量名,也...

    在前面从键盘输入字符串是使用 scanf 和 %s。其实还有更简单的方法,即使用 gets() 函数。该函数的原型为:

    # include <stdio.h>
    char *gets(char *str);

    这个函数很简单,只有一个参数。参数类型为 char* 型,即 str 可以是一个字符指针变量名,也可以是一个字符数组名。
    gets() 函数的功能是从输入缓冲区中读取一个字符串存储到字符指针变量 str 所指向的内存空间。
    下面将前面中使用 scanf 输入字符串的程序改一下:

    # include <stdio.h>
    int main(void)
    {
        char str[20] = "\0";  //字符数组初始化\0
        printf("请输入字符串:");
        gets(str);
        printf("%s\n", str);
        return 0;
    }

    输出结果是:
    请输入字符串:i love you
    i love you

    可见,gets() 函数不仅比 scanf 简洁,而且,就算输入的字符串中有空格也可以直接输入,不用像 scanf 那样要定义多个字符数组。也就是说:

    # include <stdio.h>
    int main(void)
    {
        char str[30];
        char *string = str;  //一定要先将指针变量初始化
        printf("请输入字符串:");
        gets(string);  //也可以写成gets(str);
        printf("%s\n", string);  //输出参数是已经定义好的“指针变量名”
        return 0;
    }

    输出结果是:
    请输入字符串:Hi i...like you
    Hi i...like you

    此外,关于使用 gets() 函数需要注意:使用 gets() 时,系统会将最后“敲”的换行符从缓冲区中取出来,然后丢弃,所以缓冲区中不会遗留换行符。这就意味着,如果前面使用过 gets(),而后面又要从键盘给字符变量赋值的话就不需要吸收回车清空缓冲区了,因为缓冲区的回车已经被 gets() 取出来扔掉了。下面写一个程序验证一下:

    # include <stdio.h>
    int main(void)
    {
        char str[30];
        char ch;
        printf("请输入字符串:");
        gets(str);
        printf("%s\n", str);
        scanf("%c", &ch);
        printf("ch = %c\n", ch);
        return 0;
    }

    输出结果是:
    请输入字符串:i love you
    i love you
    Y
    ch = Y

    我们看到,没有清空缓冲区照样可以输入'Y',因为 gets() 已经将缓冲区中的回车取出来丢掉了。如果前面使用的不是 gets() 而是 scanf,那么通过键盘给 ch 赋值前就必须先使用 getchar() 清空缓冲区。

    展开全文
  • 克服C语言gets函数缺陷的方法初探一 gets函数简介gets函数是C语言用于从stdin流中读取字符串的函数。gets函数接收用户从键盘上输入的字符直到遇到回车时终止。原型是:char* gets(char *buff);举例:#include int ...

    克服C语言gets函数缺陷的方法初探

    一 gets函数简介

    gets函数是C语言用于从stdin流中读取字符串的函数。gets函数接收用户从键盘上输入的字符直到遇到回车时终止。原型是:

    char* gets(char *buff);

    举例:

    #include

    int main()

    {

    charstr[30];

    while(!str!= gets(str));

    printf(“%s\n”,str);

    return 0;

    }

    如果读取成功,gets函数返回值是和str的值相同的指针,否则,返回空指针。

    二 gets函数的漏洞

    gets函数是个危险的函数,原因是用户在键盘上输入的字符个数可能大于buf的最大界限,而gets函数并不对其检查。如在上例中,如果用户在键盘上输入1111111111111111…………….输入1的个数大于30,这时会造成程序崩溃。

    三 gets函数漏洞的解决方案

    我们可以重写一个新的函数Gets

    原型是char* Gets(int maxlen)

    这个函数让程序员指定一个最多输入字符的个数,在函数中为字符分配存储空间,函数返回char*

    这个函数是针对动态数组而做的,如

    int main()

    {

    char*p;

    p=Gets(18);

    }

    Gets函数的参数之所以舍弃了传入的指针,是因为传入函数的指针可能不可靠,会造成程序崩溃,比如传入一个野指针。

    另一个Gets函数原型是

    char* const Gets(char* const array,int maxlen);

    这个函数针对固定长度字符数组的输入,如

    int main()

    {

    charstr[20];

    Gets(str,20);

    return 0;

    }

    此时Gets函数参数之一之所以是char* const类型,是因为我们容许程序员修改这个类型指针所指向的内容,而不能修改指针本身,这和char str[30]中的str[0]=’1’,但不能str++效果一样。

    具体实现代码如下:

    #include

    #include

    #include

    #include

    #include

    char* Gets(int maxlen)

    //最多从键盘上读入maxlen个字符,返回字符串指针类型

    {

    int i;

    staticchar* str;

    char c;

    str=(char*)malloc(sizeof(char)*maxlen);

    if(!str)

    {

    perror("memeoryallocation error!\n");

    return0;

    }

    else

    {

    for(i=0;i

    {

    c=getchar();

    if(c!='\n')str[i]=c;

    elsebreak;

    }

    str[i]='\0';

    returnstr;

    }

    }

    char* const Gets(char* const array,int maxlen)

    {

    int i;

    char c;

    for(i=0;i

    {

    c=getchar();

    if(c!='\n')array[i]=c;

    elsebreak;

    }

    array[i]='\0';

    returnarray;

    }

    int main()

    {

    char s[8];

    Gets(s,8);

    puts(s);

    fflush(stdin); //刷新输入缓冲区,很重要,否则会影响下一个Gets函数

    char*p=Gets(8);

    puts(p);

    return 0;

    }

    展开全文
  • 关于c++ gets函数的一个问题





    项目场景:

    c++家庭作业






    问题描述:

    使用gets函数调用,出现乱码

    #include<stdio.h> 
    
    int main ()
    {char str[100];
    
    gets(str);
    int i=0;
    while(i<100){
        if (str[i]>='a'&&str[i]<='z')
        str[i]-=32;
        printf("%c",str[i]);
        i++;
        
    }
    
            return 0;
    }
    本来想实现大写变小写,虽然实现了但。。。
    
    

    不知道为什么出现了乱码

     

    展开全文
  • Printf函数输出的格式与方法:想要一起学习交流,或者系统学习c++的可以加553014383,邀请码:悟空,裙内有众多资源及解答老师。1、输出数字的时候存在宽度和精度,那对于数字而言,输出数字有如下几种情况:int a=...

    Printf函数输出的格式与方法:

    想要一起学习交流,或者系统学习c++的可以加553014383,邀请码:悟空,裙内有众多资源及解答老师。

    1、输出数字的时候存在宽度和精度,那对于数字而言,输出数字有如下几种情况:

    int a=456;

    printf("$%d$",a);

    此时输出$456$

    printf("$%5d$",a);

    此时输出整型变量的宽度为5,比变量a的宽度大,此时输出是$[][]456$,[]表示的是空格,为了清楚地看到空格,用[]代替空格。当输出宽度比变量宽度要大时,输出自动右对齐。

    Printf("$%2d$",a);

    此时输出为$456$,当宽度比变量a的宽度小的时候,正常输出整型变量。

    以下的语句加入精度的概念。

    printf("$%5.5d$",a);

    此时的输出为$00456$,对于整数而言,加入精度的概念就是在数字右边补0,使数字自身位数加上0的位数等于精度。

    printf("$%4.5d$",a);

    此时的输出为$00456$,此时输出的结果与上一条语句相同,对于整型数字,当精度大于宽度时以精度优先。

    2、如何将输出的右对齐和左对齐

    在%后加入-,这样输出就从右对齐变成左对齐。由于默认输出是右对齐,所以在%后面加入+是没有作用的。如果在%后加入+,加好会在输出中显示。

    3、输出字符串的效果,宽度和精度同样也适用于字符串。

    gets()函数的用法:

    由于scanf函数遇到空格后就停止输入了,如果我们需要输入一句话的话,那么我们就要尝试其他的函数例如gets()函数。

    1、原型函数为char *gets(char*buffer),返回一个指向char的指针,返回的指针与传递给他的指针是同一个指针。

    例子:

    char name[20];

    gets(name);

    printf(“%s”,name);

    此时在控制界面中输入hello world,输出将会是hello world。

    上例同时也可以写成:

    char name[20];

    char *ptr;

    ptr=gets(name);

    printf(“%s”,name);

    printf(“%s”,ptr);

    此时两句话输出的都是hello world,从而证明ptr的指针就是赋给gets函数的指针。但是gets()函数有一个缺点,当输入的字符串的长度大于申请的空间时,会造成空间越界,此时在函数执行结束释放空间时会报错。

    因此,我们引出fgets()函数,这个函数是gets()函数的文件读写版本,它的原型函数为

    char *fgets(char *buffer, int n ,FILE *stream)

    第一个参数可以是变量的地址,第二个为读取字符的最大个数,第三个是需要读取的文件。当我们要从键盘进行读写时,我们可以将标准输入流的指针赋给第三个参数,实现使用fgets()从键盘进行读写。

    puts()函数:

    例子:

    char name[20];

    char *ptr;

    ptr=gets(name);

    puts(name);

    puts(“%s”,ptr);

    put是需要遇到’’才会输出的,因此通过字符串数组遍历赋值时,最后不要忘记加’’

    展开全文
  • 展开全部gets从标准输入设备读字符串函数。可以无限读取62616964757a686964616fe4b893e5b19e31333337383230,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。...
  • 我不知道你是什么编辑器,我用的是dev C++ 发现new是一个关键字,还有许多函数应用没有用头文件/*网页上的程序*/#include#include#include#includetypedef struct worker{int num;char name[20];char sex;int age;}...
  • 1.gets()【1】函数gets(字符指针)【2】头文件:stdio.h(c中),c++不需包含此头文件【3】原型:char *gets( char *buffer );【4】功能:从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在...
  • char buf[32] = {0}; gets(buf); //相当于 fgets(buf,sizeof(buf),stdin); if(buf[strlen(buf)-1] == '\n'){ buf[strlen(buf)-1] = '\0'; }
  • 发现问题最近在Linux下编译C语言,用到gets这个函数,代码如下:#include #include #include void main(){char s[100]; // 存放输入的字符串int i, j, n;printf("输入字符串:");gets(s);n=strlen(s);for(i=0,j=n-1;...
  • vs2015中gets函数报错问题解决

    千次阅读 2021-03-07 17:50:00
    vs2015中gets函数报错问题解决报错原因示例代码 报错原因 vs2015中使用的是C语言的新标准,不支持gets函数,因为gets函数可能会溢出,改用gets_s函数,格式为 > *gets_s(char* buffer,size)* 其中buffer是缓冲...
  • 请教puts和gets函数

    2021-05-21 03:51:44
    使用字符串输入函数gets()和输出函数puts()时,要用#include命令将“stdio.h”头文件包含到源文件中。而使用其他的字符串处理函数时,要用#include命令将“string.h”头文件包含到源文件中。 1. 字符串输入函数gets...
  • C语言中gets函数与getchar函数的区别

    千次阅读 2021-03-16 13:19:21
    1、gets()函数用来从标准输入设备(键盘)读取字符串直到回车结束,但回车符不属于这个字符串。其调用格式为:gets(s);s为字符串变量(字符串数组名或字符串指针),gets(s)函数与scanf("%s", &s)相似,但不完全...
  • HDU gets_s不行吗? #include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> using namespace std; #define ll long long char str[80]; int main() { while (gets...
  • 语言标次(慕满分中国章节课)_卡大学答案计_通设测试。准输作中只可字符智慧燥学章节答案案大全...函数公务知到智慧择题_选答案论与员考树_试理实践。学生心理课大网络答案健康教育。语言标次知到智慧学课后答跨境电...
  • 关于PAT(Programming Ability Test)编辑器不支持C语言gets函数的替代方案  你可能会好奇PAT的编辑器为什么不支持C语言的gets函数,来获取整行字符串的输入?总的来说,gets函数不安全,怎么不安全,请自行搜索。。...
  • 对PAT中不能使用gets函数的解决方法 while(~scanf("%c",&c))
  • gets函数是用在输入一个字符串的,可是不知道什么原因,在一开始的使用中没有出错,却在后面的使用中起不了任何作用,即是不执行这条语句,不知道是什么原因,请大家帮忙看一下啊,谢谢~~~~~#include#includegets...
  • fgets函数与gets函数

    2021-09-19 09:31:07
    首先来看看函数原型: char* fgets(char *s, int n, FILE stream); char gets(char *s); 可见fgets要传入参数n,即读入多少个字符,而gets并没有这个限制。在这里显而易见,fgets读入多少字符我们自己传参,不会造成...
  • 每当讨论 gets 函数时,大家不由自主地就会想起 1988 年的“互联网蠕虫”,它在 UNIX 操作系统的 finger 后台程序中使用一个 gets 调用作为它的攻击方式之一。很显然,对蠕虫病毒的实现来说, gets 函数的功劳不可...
  • scanf函数,getchar函数,gets函数解析 scanf函数与getchar函数的区别 scanf函数: 包含于头文件<stdio.h>中 scanf函数使用 #include <stdio.h> void main( void ) { int i, result; float fp; ...
  • //gets函数不会检查边界,会造成溢出//gcctest.c-oflaw1#include2#include3#include4#include56intmain(intargc,char**argv)7{8charbuffer[64];910gets(buffer);11}修改...
  • gets()函数

    2021-10-25 23:06:14
    gets()函数 1.描述 C 库函数 char *gets(char *str) 从标准输入 stdin 读取一行,并把它存储在 str 所指向的字符串中。当读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。 gets(str) 约等于 scanf...
  • c语言gets()函数bug!

    2021-03-08 00:55:31
    c语言gets()函数bug! gets()函数存在一个严重的缺陷,这个缺陷就是:它不会检查数组是否能够装的下输入行,我们定义了一个数组char src[5],这时候我们调用gets(src),来从标准输入读取字符串,我们看到gets()函数...
  • 在Linux下,使用gets(cmd)函数报错:warning: the 'gets' function is dangerous and should not be used.解决办法:采用fgets(cmd,100,stdin);//100为size问题解决!fgets从stdin中读字符,直至读到换行符或文件...
  • 先来讲讲大家最熟悉的gets()函数。1.gets()函数不安全。2.C11标准委员会已经将其废除,建议能不用尽量不用。解释:gets()函数的作用:它读取整行输入,直至遇到换行符,然后丢弃换行符,储存其余字符,并在其末尾添加...
  • 本人写的一个小程序,为什么用gets函数得到候选人姓名的时候,允许输入的次数总是比输入的n要少一次呢?而用scanf函数则不会,可是scanf函数没法处理空格,这是为什么呢?/*候选人得票的统计程序,设三个候选人,...
  • 展开全部gets从标准输入设备读字符串函数,可以无限读32313133353236313431303231363533e58685e5aeb931333365643662取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不...
  • scanf( )函数gets( )函数都可用于输入字符串,但在功能上有区别。若想从键盘上输入字符串"hi hello",则应该使用 gets 函数gets可以接收空格;而scanf遇到空格、回车和Tab键都会认为输入结束,所有它不能接收...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 97,745
精华内容 39,098
关键字:

gets函数

友情链接: 交通灯.zip