char str[5]; //类比整型数组
char str[]={'a','b','c','d','e'};
for(i=0; i<sizeof(str) / sizeof(str[0]); i++){
printf("%c",str[i]);
}
char str[5]="abcde";
for(i=0; i<sizeof(str) / sizeof(str[0]); i++){
printf("%c",str[i]);
}
char str[]="abcdefghijk"; //元素个数会根据真实大小来默认分配;
for(i=0; i<sizeof(str) / sizeof(str[0]); i++){
printf("%c",str[i]);
1.和整型一样
2.和整型数组略像
3.一般用char *p=“hello”;
字符串在内存种,除了有效字符以外abc,还会自动在后面补充一个 ’ \0 ‘,作为字符串的结束标志
char str[] = "abc"; //数组的大小会根据初始化的时候元素个数来确定
printf("%s",str); //结果是abc
printf("数组的个数是%d\n",sizeof(str) / sizeof(str[0]) ); //结果是4! 是因为多了一个字符’ \0 ‘ 代表字符串的结束标志
字符串数组的存储方式:
1.数组:char a[]=“this is my”;
2.指针:char *a=“this is my”;
真正计算有效字符长度用strlen
!!不能用sizeof 来计算字符串中有效字符的个数
要用 strlen ,来计算字符串大小的时候,遇到’ \0 ‘后,就结束计数!
hello \0 world
int a[128]="hello";
printf("真正的hello的真实字母个数用strlen,%d\n",strlen(a));
1.网络通信,获取消息有乱码。
2.协议两端不匹配。
#include
char *str =“你好”;
puts(str); //与printf("%s",p); 作用等价 区别是 puts();里面自己包含了\n。
原型:int puts(const char *string);
char *pstr;
//这是野指针,造成非法内存访问,会出现段错误 cmd窗口闪退。
解决办法:
char *pstr **= NULL;
pstr = (char * ) malloc (128);
scanf("%s",pstr);
puts(pstr);
gets(str);
//功能:从输入缓冲区中读取一个字符串存储到字符指针变量 str 所指向的内存空间。
原型: char *gets(char *str);
使用方式:
char *pstr=NULL;
pstr=(char *)malloc(128);
gets(pstr);
puts(pstr);
定义变量时一定要进行初始化,尤其是数组和结构体这种占用内存大的数据结构。在使用数组的时候经常因为没有初始化而产生“烫烫烫烫烫烫”这样的野值,俗称“乱码”。
memset(初始化对象的开头,初始化成什么字符,初始化多大);
memset() 函数可以说是初始化内存的“万能函数”,通常为新申请的内存进行初始化工作。它是直接操作内存空间,mem即“内存”(memory)的意思。
原型为:
void *memset(void *s, int c, unsigned long n);
char *pstr = NULL;
pstr=(char *)malloc(128);
//1.申请了空间
//2.一旦用了malloc就要注意内存泄漏的问题
//3.申请可能失败,要对返回值做判断
if(pstr == NULL){
printf("申请内存失败\n");
exit(-1);
}
memset(pstr , '\0' , 128);
1.输出字符串:
2.获取字符串:
3.计算长度:
4.初始化:
strcpy函数 作用是复制字符串。
strcpy函数的声明是“char *strcpy (char *dest, const char *src)”,表示把src所指向的字符串复制到dest。
原型:char *strcpy(char *dest , const char *src);
使用方式:把”你好“复制到Dest数组内
char strDest[128]={'\0'};
char *strSrc="你好";
strcpy(strDest,strSrc);
printf("复制字符串完毕,%s\n",strDest);
char * strncpy (char *de st, con st char *src, int n),把src所指向的字符串中以src地址开始的前n个字节复制到dest 所指的数组中,并返回dest 。
原型:
char *strncpy((char *dest , char *src , int n);
说明:
如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。
如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。
src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针(该指向dest的最后一个元素)
利用strncpy替代strcpy来防止缓冲区越界。
但是如果还要考虑运行效率的话,也许strlcpy是一个更好的方式。
strcat (拼接字符串1 , 拼接字符串2 ); //把2拼接到1上
char test[128]="我是xxx";
char *strSrc="你好";
strcat(test ,strSrc);
puts(test);
strcmp(const char *s1 , const *s2);
char *str1="123";
char *str2="1234";
int ret = strcmp(str1,str2);
printf("ret=%d\n",ret);
结果为 -1 //第一个字符串比第二个字符串小一位
5.拷贝:
strcpy (类型 *目标指针名 , 类型 *被复制指针名);
在vs中strcpy不安全 没有方法来保证有效的缓冲区尺寸 用strcpy_s代替 strcpy(char *str1 , 20 , “hello world” ); // 三个参数
strncpy(类型 *目标指针名 , 类型 * 被复制指针名);
6.拼接:
7.比较:
char *strchr(const char *str , int c);
参数说明:
1.*str //要被检索的字符串
2.int c //要在str中搜索的字符
功能:在参数str所指向的字符串中搜索第一次出现字符c(一个无符号字符)的位置。
返回值:返回一个指向该字符串中第一次出现的字符的指针,如果字符串中不包含该字符则返回NULL空指针。
使用:在str中找字符 c
char *str = "wangxiaocong";
char c= 'm';
char *p = NULL;
p = strchr(str ,c);
if(p == NULL){
printf("没有找到\n");
}else{
printf("找到了\n");
puts(p);
}
char *strstr(char *str , char *substr);
参数说明:
1.str为要检索的字符串。
2.substr为要检索的子串。
功能:用来检索子串在字符串首次出现的位置
返回值:返回字符串str中第一次出现子串substr的地址;如果没有检索到子串,则返回NULL。
使用:
#include
#include
int main(){
// 也可以改成 char str[] = "http://see.xidian.edu.cn/cpp/u/xitong/";
char *str = "http://see.xidian.edu.cn/cpp/u/xitong/";
char *substr = "see";
char *s = strstr(str, substr);
printf("%s\n", s);
return 0;
}
运行结果:
see.xidian.edu.cn/cpp/u/xitong/
char *strupr(char *str);
参数:str //要转换的字符串
功能:用于将字符串中字符转换为大写
返回转换后的小写字符串,其实就是将str返回。
char *str[]="hello"; //windows 环境下,要定义成数组的形态,否则会崩溃,在linux下不会
puts(strupr(str));
//windows 环境下,要定义成数组的形态,否则会崩溃,在linux下不会
char *strlwr(char *str);
参数说明:str //要转换的字符串
功能:用于将字符串中字符转换为小写
返回转换后的小写字符串,其实就是将str返回。
char *str[]="hello"; //windows 环境下,要定义成数组的形态,否则会崩溃,在linux下不会
puts(strupr(str));
//windows 环境下,要定义成数组的形态,否则会崩溃,在linux下不会
strtok(char *str , char *tokseps);
参数说明:
- str //要进行分割的字符串。
- tokseps //要分割的字符类型 (以什么来分割)
功能:用于将字符串进行分割。
char *str[]="wang,xiao,cong";
char *p=NULL;
p=strtok(str , "," );
if(p!=NULL){
printf("获取到第一个串%s\n",p);
}
获取第二个串的方式跟第一次不一样的是,目标字符串改成NULL
p=strtok(NULL,",");
if(p!=NULL){
printf("获取到第二个串p=%s\n",p);
}
获取第三个串的方式跟第一次不一样的是,目标字符串改成NULL
p=strtok(NULL,",");
if(p!=NULL){
printf("获取到第三个串p=%s\n",p);
}
除了第一次以外:以此类推!!
字符串的拆分保留:
char str[]="wang,xiao,cong";
char *psubs[10];
int i=1;
p=strtok(str,",");
if(p != NULL){
psubus[i-1]=p;
}
while(1){
i++;
p=strtok(NULL,",");
if(p != NULL){
psubus[i-1]=p;
}else{
printf("没有子串了\n",p);
break;
}
}
int j;
for(j=0;j<i;j++){
puts(psubs[j]);
}
8.查找字符串:
char *strchr(const char *str , int c);
9.查找子串:
char * strstr(char *str , char *substr);
10.字符串分割:
char * strtok(char *str , char *tokseps);
11.转为小写的函数:
char *strlwr(char *str);
12.转为大写的函数:
char *strupr(char *str);