1 单引号实现字符赋值
book@100ask:~/C_coding/CH01$ cat char.c
#include<stdio.h>
#include<stdlib.h>
#define N 3
int main()
{
char str[N] = {'a','b','c'};
int i;
for(i = 0; i < N; i++)
printf("%c ",str[i]);
printf("\n");
exit(0);
}
book@100ask:~/C_coding/CH01$ make char
cc char.c -o char
book@100ask:~/C_coding/CH01$ ./char
a b c
2 双引号实现字符串赋值。注意:字符串赋值,其存储空间除了字符串本身外,还包括一个尾零的空间
book@100ask:~/C_coding/CH01$ cat char.c
#include<stdio.h>
#include<stdlib.h>
#define N 3
int main()
{
char str[N] = "a";
int i;
for(i = 0; i < N; i++)
printf("%c ",str[i]);
printf("\n");
exit(0);
}
book@100ask:~/C_coding/CH01$ make char
cc char.c -o char
book@100ask:~/C_coding/CH01$ ./char
a
book@100ask:~/C_coding/CH01$ cat char.c
#include<stdio.h>
#include<stdlib.h>
#define N 3
int main()
{
char str[N];
int i;
gets(str);
puts(str);
/*
for(i = 0; i < N; i++)
printf("%c ",str[i]);
printf("\n");
exit(0);
*/
}
book@100ask:~/C_coding/CH01$ make char
cc char.c -o char
char.c: In function ‘main’:
char.c:11:2: warning: implicit declaration of function ‘gets’; did you mean ‘fgets’? [-Wimplicit-function-declaration]
gets(str);
^~~~
fgets
/tmp/cc3Tg7tU.o: In function `main':
char.c:(.text+0x24): warning: the `gets' function is dangerous and should not be used.
book@100ask:~/C_coding/CH01$ ./char
abcddsdadad
abcddsdadad
*** stack smashing detected ***: <unknown> terminated
Aborted (core dumped)
book@100ask:~/C_coding/CH01$ ./char
abdc
abdc
*** stack smashing detected ***: <unknown> terminated
Aborted (core dumped)
book@100ask:~/C_coding/CH01$ ./char
ab
ab
book@100ask:~/C_coding/CH01$ ./char
a
a
book@100ask:~/C_coding/CH01$ ./char
abc
abc
book@100ask:~/C_coding/CH01$ ./char
abcd
abcd
*** stack smashing detected ***: <unknown> terminated
Aborted (core dumped)
编译时提示,属于gets很危险,因为它不会检查边界,即即使字符数组定义范围为3个,当输入多余3个字符时,仍然可以执行,即边界失效。