C的一些知识点2

一维数组,二维数组,字符数组

对于数组,不能使用变量来表示数组长度

比如 int k;

int a[k];

这样的定义就是错误的

一维数组:其定义方式为int a[10];   或者int a[ ]={1,2,3};

如果定义int a[5]={1,2};那么后面三个数字的值会自动初始化为0

二维数组:定义方式为 int a[ 3 ][ 4]; 或者int a[ ][4 ]={1,2,3,4,5,6,7,8 };    (可以不写行标,但是必须规定列标) 

或者这样写int a[2 ][3 ]={{1,2},{3.4}};不齐的部分自动补0

字符数组:char a[10 ]={'a','b'};这样定义输出的结果就是ab,没有的部分不会补全,不过需要特别注意的是在ab之后会有一个特殊的字符。这里定义的10个长度的字符数组,如果真的写了10个字符进去,输出的时候会乱码,因此我认为在字符数组的最后是有一个'\0'的。

如果想要一个字符一个字符的打印,用%c,如果想打印一个字符串,就用%s,

scanf的话,以接收到空格或者回车作为结束的标志,如果是gets()的话只有接收到回车才是结束的标志(Linux中会出现警告)

printf和puts()都是遇见字符串最后的那个'\0'时才结束,puts()会自动输出一个'\n',即能够实现自动换行功能

刚才进行了一个实验:

当然无论是scanf还是gets()都只能输入9个字符,因为最后一个要留给'\0' 

首先,我想探讨是否gets()越界,输出就会是段错误

的确是一个段错误,并且是在输出了str的内容后提示的段错误(执行完所有任务后输出的段错误),并且scanf中输入的内容覆盖了gets()中输入的内容

下面我想验证如果gets()没有越界而scanf越界了会怎样

因为我从前遇见过这种情况,就是在程序完全执行以后报错是段错误,现在知道了,是在程序执行过程中,有数组发生了越界,也就是缓存区不够所导致的

除此之外,我还想尝试一下如果将scanf放在gets()前会是怎样:

当我故意越界的时候是否仍然会有同样的结果

scanf中一旦越界不会让我再输入gets()的内容了,直接报错

如果我没有越界,会出现怎样的情况呢

还是不让我执行gets()的操作,因此我认为,scanf如果写在gets()前,那么gets()将会被垄断,失去作用

即便我更换了缓存区重新设置一个s

得到的结果仍然是:

可见scanf的确可以垄断gets();

猜你喜欢

转载自blog.csdn.net/weixin_41556394/article/details/81271064