C语言总结之字符串

一概述:

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


猜你喜欢

转载自blog.csdn.net/null959_/article/details/80318258