我定义
char c[3]
gets (c);
puts(c);
我输入了好几十个字符,本来以为会出现溢出之类的错误,但是还是可以原样输出,难道数组的长度没有用吗?不会溢出吗?
数组的长度当然有用了。你给数组指定多大,这里就的字符串长度容纳量就是多大。
越界访问是语言的未定义行为,不能依赖于这种行为。(即使看起来有时候它不出错)
你这里程序没有出现问题,仅仅是巧合而已。具体什么时候溢出会影响程序执行,取决于平台和编译器实现。
打个比方,如果有个变量紧跟在数组后面,数组越界了,那么这个变量就会被改变。
我给一个例子:
#include <stdio.h>我使用 64 位 Linux 编译运行的结果如图。若看不清楚请右键点开原图。
左下角窗口显示了执行情况:
第一次,我输入了16个字符,结果和 str 无关的 c 变成了 我输入末尾的 'F',这正是我输入的第 16 个字符(从零算是15)
第二次,我输入了15个字符,结果 c 变成了 '\0',而C语言数组末尾的 '\0' 也是正是 str 的第 16 位,即 str[15] (下标从零开始)
第三次,我输了 14 个字符,加上末尾的 \0 是 15 个。此时 c 没有被改变,仍然是 ‘x'.
可以猜想。str 和 c 在内存上相差 15 个字节(因为 sizeof(char) 正好 1 字节)。
把程序用 objdump 反汇编(右上窗口)。可以看出:
movb $0x78, -0x1(%rbp) 这一句对应的就是 C 语言的 char c = 'x', 字符x 的 ascii 码是十六进制 78. 所以可以看出,c 的地址是 %rbp 寄存器储存量左移 0x1 字节,你可以理解成坐标为 -1;
从 gets(str) 调用下面的汇编代码可以找到, 而 str 的地址为 %rbp 寄存器储存量左移 0x10 字节,也就是十进制的 -16。
这二者正好相差 15, 验证了我们的猜想。
纯手工码字截图,望采纳。
c语言 gets函数 puts函数
1.puts(字符数组):将一个字符串(以'\\0'结束的字符序列)输出到终端。由于printf函数可以输出字符串(%S),因此puts函数不常用。用puts函数可以输出的字符串可以包含转义字符!在输出时将字符串结束标志'\\0'转换成'\\n',即输出完字符串后换行。2.gets(字符数组):从终端输入一个字符串到字符数组...
C语言中如何用 gets(),put()
gets()、puts()都是针对字符串类型处理的,传入的参数是char *型,或char[]型 gets()是输入字符串函数,puts()是字符串输出函数 例如:char *a;gets(a);或者:char a[10];gets(a);相当于:scanf("%s",a);输出函数:puts(a);相当于:printf("%s\\n",a);...
c语言中,gets()和puts()函数与getchar()与putchar()函数有何区别
puts()函数用来向标准输出设备(屏幕)写字符串并换行,其调用格式为:puts(s);其中s为字符串变量(字符串数组名或字符串指针),puts()函数的作用与语printf("%s\\n",s)相同。gets()函数用来从标准输入设备(键盘)读取字符串直到回车结束,但回车符不属于这个字符串。其调用格式为:gets(s);s为字符串变量...
c语言gets()函数
1、首先在C语言中打开vscode编辑器,定义一个字符数组words来存储输入的字符。2、然后用puts函数提示用户输入内容。3、接着用gets函数将输入的内容赋值给words变量。4、然后用printf函数将words这个变量的值打印出来。5、最后运行程序,查看运行结果。
在C语言中如何实现用键盘输入一个字符串,并打印出来
在C语言中实现用键盘输入字符串并打印的方法步骤如下:首先,需定义一个数组空间用于存放字符串,例如分配100个数组单元。接着,使用gets()函数读取键盘输入的字符串,调用格式为gets(字符数组名)。然后,应用puts()函数输出之前读取的字符串内容,使用方法为puts(字符数组名)。最后,运行程序,即可成功...
请问C语言中的这些语句gets,fgets,puts,sprintf,strcpy,strcat,strcm...
gets【1】函数:gets 【2】头文件:stdio.h 【3】功能:从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在str指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为null值,并由此来结束字符串。【4】注意:本函数可以无限读取,不会判断上限,所以程序...
怎么定义一个字符串,并输入,输出。
1、puts()和gets()都是数组函数,输入或输出前要定义数组,一个简单的输入后再将输入的东西输出,puts()的输入和printf的输出是有一定的区别的,puts()遇到‘\\0'就终止,而用printf则不会这样。2、例如:char a[50];gets(a);puts(a);二、用scanf\/printf输入输出。1、scanf\/printf是C语言的...
C语言gets函数、puts函数对最后一行数据无效?
include <stdio.h> define M 10 define N 51 int main() { int i,m;char passage[M][N];scanf("%d",&m);if(m < 1 || m > 10) m = M;fflush(stdin);for(i = 0; i < m; i++)fgets(passage[i],N - 1,stdin);for(i = 0; i < m ;++i)puts(passage[i]);return...
puts\/gets 和 scanf\/printf 用法上的区别...
一、调用形式不同 gets()函数实现字符串的输入,其调用形式为:gets(字符数组);调用puts()函数实现字符串的输出,其调用形式为:puts(字符数组);二、格式 scanf语句的一般格式如下:scanf("格式字符串", 地址,…);printf语句的一般形式如下:printf( "格式字符串", 表达式, ... );该语句将"...
c语言 gets函数 puts函数
movb $0x78, -0x1(%rbp) 这一句对应的就是 C 语言的 char c = 'x', 字符x 的 ascii 码是十六进制 78. 所以可以看出,c 的地址是 %rbp 寄存器储存量左移 0x1 字节,你可以理解成坐标为 -1;从 gets(str) 调用下面的汇编代码可以找到, 而 str 的地址为 %rbp 寄存器储存量左移 0x...