黑马程序员——字符串的概念,定义,以及注意事项
**一、 概念:**
字符串是位于双引号中的字符序列,在内存中以“\0”结束。所占字节比实际多一个。
例:字符串”HELLO”在内存的储存方式
H |
E |
L |
L |
O |
\0 |
注意事项:
1、一个字符常量可以赋值给一个字符变量,字符串常量不能赋值给字符变量。
例:char ch=’a’正确 char ch=”hello”错
2、在C里边用字符数组来存储字符串
例:char ch[10]=”ac”
**二、定义:**
1、一维char 数组名[常量表达式]
例:char ch[10]
二维 char 数组名[常量表达式1] [常量表达式2]
例:char ch[10][5]
注意事项:
定义字符数组时,应该确保数组长度比字符串长度至少多1个
**三、 字符串的储存**
1、 可以是 char ch[4]={”abc”};也可以是 char ch[4]=”abc”;
2、 字符串在内存中存储的时候是以单个字符存储的
#include <stdio.h>
int main(int argc, const char * argv[])
{
char ch[]=”hello”;
for(int i=0;i<sizeof(ch);i++){
printf(“%c\t”,ch[i]);
}
return 0;
}
打印的结果是:h e l l o
**四、 字符串的输出、输入**
1、%c
当我们想要看到的是一个字符串,但是每次打印的却是一个字符
1 #include <stdio.h> 2 3 int main(int argc, const char * argv[]) 4 5 { 6 7 char ch[10]=”itcast”; 8 9 for(int i=0;i<10;i++){ 10 11 printf(“%c\t”,ch[i]); 12 13 } 14 15 return 0; 16 17 }
打印结果:i t c a s t Program……..
2、%s
而%s输出的就是一个字符串。从给定的地址开始,一直输出字符,知道遇到\0停止
1 #include <stdio.h> 2 3 int main(int argc, const char * argv[]) 4 5 { 6 7 char ch[10]=”itcast”; 8 9 printf(“%s\n”,ch); 10 11 printf(“%s\n”,&ch[0]); 12 13 return 0; 14 15 }
打印结果:itcast
itcast
Program……..
输入
%s接收键盘上输入的一个字符串
从键盘上接收一个字符串,保存在以ch为首四肢字符数组中
#include <stdio.h>
int main(int argc, const char * argv[])
{
char ch[10];
scanf(“%s”,ch);
printf(“-------%s\n”,ch);
return 0;
}
打印结果:---------itcast
Program….
注意:
1、如果以%s格式进行输入的话,注意空格问题。
如果输入的字符串有空格,则空格之后的字符将无法被接收保存(以%s格式输入,scanf遇到空格,就结束)
2、输入字符串长度要小于数组长度
五、计算字符串的长度
#include <stdio.h>
int main(int argc, const char * argv[])
{
//字符串的长度
//字符串的长度恰好等于了数组在内存中占用的字节数
char ch[]=”abc”;
printf(“%ld\n”,sizeof(ch));
char ch1[]=”abc\0abc”;
printf(“%ld\n”,sizeof(ch1));
return 0;
}
打印结果:4
8
Program……..
//有专门计算字符串的长度的方法
//1、使用字符串函数:strlen(ch)
//2、以\0作为条件,进行判断。遇到\0就结束
\0之前的就是字符长度
不知道数组长度的群殴你工况下,计算字符串长度
//char ch[]=”abc”
Int i=0;
while(ch[i]!=’\0’) i++;
printf(“%d\n”,i);
打印:3
五、 字符数组与普通数组区别
1) 字符数组的每个元素都是char类型,整形数组的每个元素都是int类型
2) scanf()和printf()函数有一种格式化字符串%s可以用来整体输入输出数组,但是没有特定的格式int数组整体数组输出。
3) 字符数组,初始化char ch[]=”ab”;
整形数组,初始化 不能去掉大括号
6、字符串函数的使用
使用puts和gets,必须包含头文件stdio.h
puts() 输出一个字符串
1 #include<stdio.h> 2 3 int main(){ 4 5 char ch[]="abc"; 6 7 printf("%s\n",ch); 8 9 //puts(字符数组地址); 10 11 //1)puts函数可以自动换行 12 13 //2)字符数组:也可以不是数组的首地址,可以是元素的地址:put(&ch[1]) 14 15 //使用gets可以接收空格 16 17 puts(&ch[1]); 18 19 }
gets() 输入一个字符串
#include<stdio.h>
int main(){
char ch1[100];
scanf("%s",ch1);//缺陷:输入字符串的时候不能有空格
/*警告:不安全,数组长度为10的时候,但是如果输入12个字符的时候,不会报错,不能检测越界问题
使用gets可以接收空格*/
gets(ch1);
puts(ch1);
}
需要包含string.h的头文件
strcat() 连接一个字符串,把两个字符串连接成一个字符串
strcat(A,B)把字符串B连接到A的后边去
1 #include<stdio.h> 2 3 #include<string.h> 4 5 int main(){ 6 7 //strcst使用的时候必须引入头文件string.h 8 9 //1)格式:strcat(ch,ch1); 10 11 //2)ch的长度要足够长,要能保存下ch+ch1的长度 12 13 //3)ch1把ch的最后一个字符\0给覆盖了 14 15 char ch[100]="welcome to "; 16 17 char ch1[]="you!"; 18 19 strcat(ch,ch1); 20 21 puts(ch); 22 23 }
结果:welcome to you
strcpy 字符串拷贝函数
strcpy(ch,ch1);
把ch1拷贝到ch中,ch1会覆盖掉ch中的内容
strcmp 字符串的比较函数
strcmp(ch,ch1);
比较两个字符串的大小(比较字符的Ascii码值,逐个比较)
strcmp(ch,ch1); 有返回值 >0 ch>ch1 <0 ch<ch1 = =0 ch= =ch1
strlen 字符串的长度的计算
strlen(ch); 计算的长度不含\0