一 . 使用带%s格式符的scanf函数读入字符串时,不需要再参数前加取地址符&。
原因:编译器会自动将数组名作为数组首地址来处理。
如:scanf("%s", str);
二 . 字符数组与字符串
(这两个概念其实现在我也不是很清楚),但看到的一句话可以帮助理解:在C语言中,将字符串当作字符数组处理。
字符数组的初始化:
char str[3] = {'a', 'b', 'c'};
char str[3] = {'a', 'b'}; ——剩余的元素值自动设为空字符'\0'。
怎样证明剩余的元素值自动设为了空字符呢?
我们可以输出它的ASCⅡ值:
#include <stdio.h>
int main()
{
int str[3] = {'a', 'b'};
printf("%d", str[2]);
//因为数组是从str[0]开始记的
printf("\n");
return 0;
}
由于刚开始在上面的那段代码中我输出用的,但运行时仍是0,这是不是说明了一个问题呢:
当C编译器在程序中遇到长度为n的字符串常量时,他会为这个字符串常量分配长度为n+1的字符数组空间,最后一个空间用于存储空字符'\0',用来标志字符串的结束。
但问题是,这并不是字符串啊,这是使用逐个字符列举的方式对字符数组进行初始化的!!!!
![这是我分别改为输出str[3],str[4],str[5]的结果,每次改后执行了两次](https://img-blog.csdn.net/20171114163211919?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdDExMzgz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![但如果我定义为char类型后,分别输出str[2]和str[3]又是这种情况](https://img-blog.csdn.net/20171114163603216?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdDExMzgz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
不清楚为什么会这样,现在还找不到答案!!
字符串(用字符串常量初始化字符数组):
char str[] = {"hello"};
char str[] = "hello";
强调:字符串用双引号”“,字符常量用单引号’ ’ 。