一概述:
C语言中没有字符串这种类型,如果想要表示字符串需要使用char类型的数组,因为字符串本身就是个多字符串的组合.
注意:1.字符串是一个特殊的数组,在它的结束位置加上一个'\0'.'\0'是ASCII码值为0的字符,是一个空操作符,表示什么也不干。
所以采用字符数组存放字符串,赋值时候要包含结束标志'\0'.
2.如果使用字符串赋值的时候程序会自动添加'\0'作为结束符.
随便复习这个哈:
二.字符串的初始化:
char a[] = {'x','b','\0'}; printf("%s",a);//结果就是"xb"字符串内容.如果换成整型输出格式,就是a的地址
printf("%address=%x",a);//结果就是address=5fbff890
注意:如果后面的没有\0结尾,会出现什么情况呢?
char b[] = {'I','a','m'}; printf("%s",b) // Iamxb
wtf?什么鬼?为什么把a也输出了呢?
要搞清为什么,首先先看看a和b的内存地址:
printf("a的地址:%x",a); printf("b的地址:%x",b);
结果为:a的地址:5fbff890, b的地址:5fbff888
可以看出数组a和b的内存地址是连续的.
%s表示期望输出一个字符串,因此printf函数会从b的首地址开始按顺序输出字符,一直到\0字符为止,因为\0是字符串的结束标记。
所以,如果想要创建一个字符串,记得加上结束符\0,不然后果很严重,会访问到一些垃圾数据。
补充:如果字符串长度少于数组长度:
char str[10]={ 'I','a','m','h','a','p','p','y'};
如果花括号中提供的字符个数大于数组长度,则按语法错误处理;
若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即 '\0' )。
三.直接赋值给字符串,此时不需要手动添加\0,编译器自动添加.
char c[] = "xb"; printf("c=%s",c);//c=xb
3.1.二维数组存储多个字符串
//二位数组存储多个字符串 char d[2][3] ={"xb","is","very","good","la","laa"};
四.扩展.字符串操作常用函数
1.putchar(字符串操作)一次只能输出一个字符串:
putchar('a');//结果 a putchar(97); //结果 a
2.getchar();
char a; a=getchar();//getchar()一次只能接收一个字符,可以接收空格、tab、回车 printf("a=%c",a); printf("\n");
3.puts();从c的首地址开始输出字符,一直直到\0字符为止.会自动添加换行
1 char c[] = "xb"; 2 puts(c);//xb
4.gets() 和scanf() 可以用来接收用户输入的字符串
char c[10]; scanf("%s",c);//注意c没必要写成&c,因为c本身就代表了数组的地址 printf("c=%s\n",c);//注意即使你输入的内容大于10,也能正确输出,但是下面的gets()函数却不行 printf("\n"); //gets()函数,注意它是不安全的,因为接收的时候不知道它的大小容易造成溢出,建议不要使用 char d[10]; gets(d); //gets一次只能接收一个字符串,但是scanf可接收多个;scanf不能接收空格、tab,gets则可以 printf("d=%s",d); printf("\n");scanf函数会从a的首地址开始存放用户输入的字符,存放完毕后,系统会自动在尾部加上一个结束标记\0
注意,不要写成scanf("%s", &a),因为a已经代表了数组的地址,没必要再加上&这个地址运算符。
gets跟scanf一样,会从a的首地址开始存放用户输入的字符,存放完毕后,系统会自动在尾部加上一个结束标记\0。
* gets一次只能读取一个字符串,scanf则可以同时读取多个字符串
* gets可以读入包含空格、tab的字符串,直到遇到回车为止;scanf不能用来读取空格、tab