首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么输出是跳过gets语句(&char*)

在C语言中,gets函数用于从标准输入流(键盘)读取一行字符串,并将其存储在指定的字符数组中。然而,使用gets函数存在安全风险,因为它无法检查输入字符串的长度,可能导致缓冲区溢出漏洞。

缓冲区溢出是指当输入的字符串长度超过了目标字符数组的大小时,多余的字符会覆盖到相邻的内存区域,可能破坏程序的正常执行,甚至导致安全漏洞。为了解决这个问题,C语言引入了更安全的函数fgets来替代gets

fgets函数的使用方式类似于gets,但它需要指定读取的最大字符数,以避免缓冲区溢出。fgets会读取指定数量的字符,包括换行符,并将其存储在指定的字符数组中。如果输入的字符串长度超过了指定的最大字符数,fgets会将剩余的字符留在输入缓冲区中,以便后续处理。

因此,为了避免使用不安全的gets函数,应该使用更安全的fgets函数来读取用户输入的字符串。以下是一个示例代码:

代码语言:txt
复制
#include <stdio.h>

int main() {
    char input[100];
    printf("请输入字符串:");
    fgets(input, sizeof(input), stdin);
    printf("输入的字符串是:%s", input);
    return 0;
}

在上述示例中,fgets函数用于读取用户输入的字符串,并将其存储在名为input的字符数组中。sizeof(input)用于指定最大字符数,这里是100。stdin表示从标准输入流读取。

总结起来,输出跳过gets语句是为了避免使用不安全的函数,而使用更安全的fgets函数来读取用户输入的字符串,以防止缓冲区溢出漏洞的发生。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

下列python语句输出结果print_下列 Python语句输出结果「建议收藏」

【单选题】Python语句 print(type(1/2)的输出结果 【填空题】下列Python语句的程序运行结果为: class account: def __init__(self, id, balance...(只写函数名) 【判断题】如有下面代码,输出的结果一个元组 def f(a,b,c): print(a,b,c) f(*(1,2,3)) 【单选题】下面的程序段求x和y两个数中的大数,( )不正确的...【填空题】下列 Python语句输出结果 def judge( param,*param2): print(param2) judge(1,2,3,4,5) 【填空题】将读取的内容写入到文件中。...【单选题】Python语句 print(type([1,2,3,4])的运行结果 【单选题】print(r”\nGood”)的结果 【填空题】下列 Python语句输出结果 def judge(...(i,end=’-‘)”的输出结果为( ) 【单选题】Python语句 print(type(1J))的输出结果 【填空题】Python语句re. split(‘\W+’,’go, went, gone

1.2K40

为什么这段代码输出”Hello World”

Stackoverlfow.com上有一篇有趣的讨论帖: 在这篇帖子里提到了如下的程序: 明明在程序里使用了java.util.Ramdom()函数产生随机数,为什么每次打出的结果都是Hello world...首先看一下这个程序的工作原理: 通过这句命令首先得到的六个数: 8 5 12 12 15 0 然后,通过new Random(-147909649).nextInt(27)得到的6个数: 23 15...18 12 4 0 这样一来,根据:sb.append((char) (‘`’+n)); 得到: 8 + 96 = 104 --> h 5 + 96 = 101 --> e 12 + 96 = 108...这就是为什么每次运行该程序都会产生同样的结果的原理啦~ 当然,关于这个话题,高手林立的Stackoverflow上不缺乏懂行的专家和见解的。...尤其在复杂的计算环境下的高质量随机数的产生,需要牵涉到非常高深的计算科学和数学方面的理论研究。 在计算机随机数产生的理论研究上,美籍华人姚期智(目前任职于清华大学)世界顶尖的专家。

94320

java的格式输入语句_java输入输出语句是什么「建议收藏」

大家好,又见面了,我你们的朋友全栈君。...对于经常上机刷题的来说,首先得解决输入输出方法,Java的输入输出流在Java学习过程的后面部分才会接触,但是我们可以掌握一些简单的,常用的输入输出方法 输出流 java常用的输出语句有下面三种: System.out.println...();//换行打印,输出之后会自动换行 System.out.print();//不换行打印 System.out.printf();//按格式输出 输出示例 public class test {...public static void main(String []args){ System.out.println(1111);//换行打印,输出后自动换行 System.out.print(1111...);//不换行打印 System.out.printf(“分数:%d”,88);//按格式输出 } } 输入流 java的输入需要依赖Scanner类: import java.util.Scanner

80230

为什么这段代码输出”Hello World”

Stackoverlfow.com上有一篇有趣的讨论帖: 在这篇帖子里提到了如下的程序: 明明在程序里使用了java.util.Ramdom()函数产生随机数,为什么每次打出的结果都是Hello world...首先看一下这个程序的工作原理: 通过这句命令首先得到的六个数: 8 5 12 12 15 0 然后,通过new Random(-147909649).nextInt(27)得到的6个数: 23 15...18 12 4 0 这样一来,根据:sb.append((char) (‘`’+n)); 得到: 8 + 96 = 104 --> h 5 + 96 = 101 --> e 12 + 96 = 108...这就是为什么每次运行该程序都会产生同样的结果的原理啦~ 当然,关于这个话题,高手林立的Stackoverflow上不缺乏懂行的专家和见解的。...尤其在复杂的计算环境下的高质量随机数的产生,需要牵涉到非常高深的计算科学和数学方面的理论研究。 在计算机随机数产生的理论研究上,美籍华人姚期智(目前任职于清华大学)世界顶尖的专家。

96620

c语言每日一练(4)

B选项,break只会跳出一层循环,同样的,在switch语句中它也只会跳出一层switch,站在break的角度来看,switch和循环语句等价的,谁来我都只跳过一层,B的描述则是跳出了两层,故B错...C选项跟continue语句的作用完全不符,continue语句的作用是跳过循环体中剩余的语句而强行执行下一次循环,故C错。D选项大错特错,continue语句设计出来就是给循环用的。...综上所述,答案选A 4、设函数 fun 和实参数组的说明如下形式,则对函数的调用语句中,正确的( ) void fun(char ch,float x[]); float a[10]; A.fun...而D传了一个数字,好像错了,但它是对的,为什么?...#include #include int main() { char arr1[1000]={0}; char arr2[1000]={0}; gets(

10610

scanf的一些技巧

一、scanf和gets 1.不同点:   char string[50];   scanf("%s",string); //当遇到回车,空格和tab键会自动在字符串后面添加'\0',但是不能接受回车,...这就造成程序中只有一个输入字符的scanf()语句时,问题还不大,但如果后面还跟着第二个scanf()字符输入语句,这个scanf()就把前面输入的回车符当作输入字符了。...有了这个空格,因为scanf()跳过空格读字符的,就回避了这个问题。实践证明,这个空格放在%c后面也不能达到目的。应当说,这也是比较巧妙的应用!...三、scanf("%d",&n) 与 scanf("%d ",&n)   这个利用了上面二中的方法,如果程序scanf("%d",&n)之后要读char,会把读入n之后的空格读进ch,而scanf("...%d ",&n)这里d后面多个空格,就相当于后面%c前多了个空格,不管scanf("%c",&ch)还是ch=getchar(),都可以跳过那个回车。

61120

C语言 | 将字符串中的元音字母复制到另一个字符串中

例70:C语言写一个函数,将一个字符串中的元音字母复制到另一字符串,然后输出。 ...解析:if语句判断一下每一个字母是否符合元音字母,读者看着道题的时候,需要注意一点的如果用scanf函数是否可以,思考为什么要用gets函数?...源代码演示: #include//头文件  int main()//主函数  {   void copy(char s[],char c[]); //函数声明    char str[...80],character[80]; //定义字符数组    printf("输入字符串:");//提示语句    gets(str); //键盘录入    copy(str,character); /.../调用该函数    printf("元音字母:%s\n",character);//输出复制后的字符串    return 0;//主函数返回值为0  }  void copy(char s[],char

4.6K74

C语言中的字符串处理

字符数组与字符指针 一起来比较一下下面两个声明: char date[] = "June 14";它声明date个字符数组。...和这个声明相似的下面这个声明: char *date = "June 14";它声明date个指向字符串字面量的指针。 [注意],不能错误地认为上面两种date可以互换。...这时声明指针变量不够的。下面的声明使编译器为指针变量分配了足够的内存空间: char *p;可惜的,它不为字符串分配空间。在使用p作为字符串之前,必须把p指向字符串数组。...这里的 p 要显示的字符数量。语句 printf("%.6s\n", str);会显示出 Are we  C函数库还提供puts函数。...然而,在其他方面 gets 函数有些不同于 scanf 函数: (1) gets 函数不会在开始读字符串之前跳过空白字符( scanf 函数会跳过)。

1.1K30

字符串

定义字符数组存放字符串时,可以使用如下两种初始化方式: char msg[] = {"hello"}; char msg[] = "hello"; 字符串的输入输出方式 (1) 在循环语句中使用scanf...如:char msg[80]; scanf(“%s”,msg); (3) 使用gets函数输入整行字符作为字符串。...如:char msg[80]; gets(msg); 注意:使用scanf()和gets()输入字符串时,不用手工添加中空字符格。...判断字符串结束的依据:碰到空格、Tab和回车等字符时,认为字符串已结束,且自动在字符串后面加上结束标记。 字符串的输出方式 由于字符串存放在字符数组中,因此输出字符串时可以采用如下两种方式进行。...(1) 在循环语句中使用printf函数的“%c”格式控制字符逐个输出字符。例如: char msg[20] = "hello"; for(i=0; msg[i]!

23920

sqlite3的C语言使用(一)

软件功能:添加、查询、删除、全部输出。 ...sql:执行的sql语句。     第三个参数个回调函数,在执行本函数后会执行回调函数,不用则填NULL。     第四个参数传给回调函数的参数,不用则填NULL。    ...(回车结束):"); gets(szEmail); printf("输入地址(回车结束):"); gets(szAddress); char sql[512]; sprintf(sql,"INSERT...我们这个函数将sql语句编译成二进制字节码,以便后面的函数使用,编译好的东西就是stmt(第五个参数)。别问我为什么,我也不知道,但要执行sql来查询就要编译。...因为得到返回值的一行,所以说要用循环语句来得到所有行。当然如果只有一行就不用了。我们这里查询某个人的信息,结果应该只有一行,所以执行一次step就行。

3.1K11

串口调试工具--UartAssit

其一般形式为: \[n:expression#remark] 这是一种三段式表示法:第1段输出数据长度,第2段计算表达式,第3段注解(注释)文字。...因此,运算表达式在形式上必须一条具有返回值的脚本语句构成,而不允许分多条语句实现。如果一条语句无法实现,只能通过下一节所介绍的包含多条脚本语句的BLOCK代码段实现。...(1)printf - 格式化输出到控制台 函数原型: void printf(const char format, 可选参数...); 功能描述:按指定格式向标准输出设备(日志/接收窗口)输出调试打印信息...(3)strtoint - 字符串转整形数 函数原型: int strtoint(const char *nptr); 函数别名: atoi 功能描述:strtoint函数会扫描参数 nptr字符串,跳过前面的空白字符...不同的return语句执行后就会立即退出当前BLOCK,不会再执行当前BLOCK的后续代码;而echo语句则不会退出BLOCK,后续如果有多个echo函数输出数据,这些数据会流式拼接在一起作为当前BLOCK

5.7K10

最通俗易懂地讲解scanf、gets和getchar的区别

这一点和 gets 不同的!!!在后面的 gets 中会有详细地介绍。 小结: 不接收 空格,不接收 回车。 2、getchar 接着要说的, getchar() 函数。...== 在很多时候会出现这样一种情况,即先输入了一个 scanf 的语句,然后可能要用到 gets ,这个时候上一个 scanf 留下的 回车 就会打搅乱下面的数据读取!!!...小结: 不接收 空格 和 回车 2、gets 到这里,你应该不会忘记上面说过的 scanf 如何处理 回车符(\n) 的了,这一点和 gets 差别巨大的!!!...---- 除了 回车 就是 空格 的问题了,gets 接收 空格 的,也就是可以读取并输出 空格。...(a); scanf("%s",&a); printf("%d",strlen(a)); return 0; } 这也就解释了为什么前面要用 gets 或者 getchar 去去除

4.9K31

C语言缓冲区之 gets(str);fflush(stdin); rewind(stdin);setbuf(stdin, NULL);

例如用户输入字符’a’, 打印结果97,10。这是为什么呢? 【分析】: scanf()和getchar()函数从输入流缓冲区中读取值的,而并非从键盘(也就是终端)缓冲区读取。...其实这里的10恰好回车符!这就是为什么这个程序只执行了一次输入操作就结束的原因! 【解决办法】: 清空缓冲区的残留数据。...0 printf("请输入字符串:"); gets(str); printf("%s\n", str); return 0; } 输出结果: 请输入字符串:i love...); //也可以写成gets(str); printf("%s\n", string); //输出参数已经定义好的“指针变量名” return 0; } 输出结果: 请输入字符串...0; } 输出结果: 请输入字符串:i love you i love you Y ch = Y 我们看到,没有清空缓冲区照样可以输入’Y’,因为 gets() 已经将缓冲区中的回车取出来丢掉了

2.7K31

C语言:字符数组的输入输出

大家好,又见面了,我你们的朋友全栈君。 目录 用printf输出 用scanf输入 用gets输入 用puts输出 ---- 用printf输出 输出方法1:printf 逐个字符输出。 ...printf(“%s”, c); //按字符数组名c找到其数组起始地址,然后逐个输出其中的字符,直到遇到’\0’为止。 图片 为什么输出一个anan呢?...一般利用gets函数的,目的向字符数组输入一个字符串,而不关心其函数值。 ...下面这一段呢,根据自己之前做的一些工作,见下面。 自己的小疑虑:输入8个字符,为什么不把最后的两个’\0’输出呢?...答案:小傻子,你用%s输出的字符串,字符串遇’\0’则止的字符数组,所以就输出有效字符就好了。看下面的例子,我们把字符数组里面所有的字符输出,是不是就有那两个’\0’呢。

4.5K10

【期末复习】考试月来临!☀️C语言复习,这一篇带你逃离挂科区!(上)⭐️

C语言本身不提供输入输出语句通过库函数scanf和printf提供的 程序应当包含注释,注释能大大的提升代码的可读性 对于长期打js代码的来说,分号真的它容易忘记了!!...2.5.1 if语句 if(表达式) { 执行内容 } 如果表达式为真,则执行{}里的内容,否则将跳过不执行该code 2.5.2 if…else 语句 if(表达式) { 代码块1; }else {...while循环,因此使得输出语句只有两条 2.5.8 continue语句 continue会跳过当前循环中的代码,强迫开始下一次循环。...会自动输出一个回车符 将字符串结束符\0转换成\n 2.6.6 gets函数输入 gets() 也存在缓冲区概念,当按下回车键时,就代表输入结束了,gets() 开始从缓冲区中读取内容。...gets()中空格也是字符串中的一部分,只有遇到回车键时才会认定字符串输入结束,所以,不管输入了多少空格,只要没有回车,对 gets() 来说就是一个完整的字符串。

78330

c语言 数组存放规则,C语言数组详解

例如,输出有10 个元素的数组必须使用循环语句逐个输出各下标变量: for(i=0; i<10; i++)  printf(“%d”,a[i]); 而不能用一个语句输出整个数组,下面的写法错误的:...然后分别输出这四个数组中的字符串。在前面介绍过,scanf的各输入项必须以地址方式出现,如 &a,&b等。但在例4.8中却是以数组名方式出现的,这是为什么呢?...当需要按一定格式输出时,通常使用printf函数。 2.字符串输入函数gets 格式: gets (字符数组名) 功能:从标准输入设备键盘上输入一个字符串。...因此在gets函数中使用cs[i]合法的。 在第二个for语句中又嵌套了一个for语句组成双重循环。 这个双重循环完成按字母顺序排序的工作。...对数值数组不能用赋值语句整体赋值、输入或输出,而必须用循环语句逐个对数组元素进行操作。

6.2K30
领券