字符串(字符数组)
定义的几种格式: 1.和整数一样 2.和整数数组略像 3.一般用char *p = “hello”;
定义方式:
1.1 char c = 'c'; 1.2. char c[3] = {'h','e','l','l','o'}; 2.1 char c[5] = "hello"; 3.1 char c[] = "hello"; 4.1 char *c = "hello";4.1像这样直接赋值还好,如果是先定义一下指针变量,再赋值就得开辟空间,不管你是野指针还是NULL ,赋值得开辟空间,否则造成非法内存访问,出现段错误。 char c; //或者 char c = NULL; c = (char )malloc(128); //这里是给开辟了128字节空间,并且强转为char 型。 如果不开辟空间就会出现段错误。**
if(c == NULL) { printf("开辟空间失败\n"); **//做一下判断 判断是否开辟空间成功。** exit(-1);**//程序异常退出。** } gets(c); **//获取字符串** puts(c);**//输出字符串** **注:字符串在内存中除了有效字符之外,在后面还会有一个’\0’作为结束的标志。 真正来计算字符串有效字符 用strlen. strlen数到有’\0’就停止数了。**
字符串常用的几种: <1>输出字符串
1.printf(); 2.puts();//会自动换行<2>获取字符串
1.scanf(); 2.gets();<3>计算长度
strlen();<4>初始化
memset(初始化对象,初始化成什么,给多大内存初始化); memset(c,'\0',128); //把C变量128字节全部初始化为'\0'。<5>拷贝 strcpy原型:
`char *strcpy(char* dest, const char *src);` 1.strcpy(c,hello); **//把hello拷贝给变量C。**strncpy原型:
char *strncpy(char *dest, const char *src, int n) 2.strncpy(c,hello,2); **//把中间的hello 的 前两位拷贝给变量C。**<6>拼接 原型:
extern char *strcat(char *dest, const char *src); strcat(a,b); **//把指针变量a的字符串 和 指针b变量的字符串拼接一起,比如a 里面的内容是:he b内容是:llo 那么拼接后 就是hello。** puts(a); ----------------- **//输出 hello。** *<7>比较*
strcmp(a,b); **//对a变量字符串和b变量字符串比较大小, a>b返回值为正,b<a返回值为负,a=b返回值为0**<8>查找子字符 原型:
char *strchr(const char *str, char c)//str 是被检索的,c 是你要查找的。一个字符串,一个字符。 返回一个指向该字符串中第一次出现的字符的指针,如果字符串中不包含该字符则返回NULL空指针。 例:
char *c = "hello"; char *p; char a = 'e'; p = strchr(c,a); *//比如c变量字符串是hello,就是在变量c中查找 e 这个字母。按着c变量字符串顺序查找有没有e 找到第一次出现的e,然后返回e及后面的字符串,即ello* puts( p); // 输出 ello 。 if(p == NULL) { printf(“没有找到”); }
<9>查找子串 原型:
char*strstr(char* str,char* substr);str参数是要检索的字符串(被查找),substr参数为要检索的子串(查找的内容是什么)。 返回字符串str中第一次出现子串substr的地址,如果没有检索到子串,返回NULL。 例: char *str = “hello”; char *substr = “el”; char *p; p = strstr(str,substr); //在str字符串中(hello) 查找substr字符串(el)。查到输出ello 否则 返回NULL。 puts§; // 输出 ello;
<10>转为小写 原型:
extern char *strlwr(char *s);char *str = “HELLO”; //注:这种定义在Linux下是可以的 但在Windows 得定义成数组 char str[] = “HELLO”; strupr(str);//转为小写 puts(str); //输出 hello.
<11>转为大写 原型:
extern char *strupr(char *s)char *str = “hello”; //注:这种定义在Linux下是可以的 但在Windows 得定义成数组 char str[] = “HELLO”; strupr(str);//转为大写 puts(str); //输出 HELLO.
<12>字符串分割 原型:
char *strtok(char *strings,const char*tokseps);strtok(分割的字符串,分割的标志); 例: char *str = “ab,cd,ef,gh”; //这种定义在Linux下是可以的 但在Windows 得定义成数组 char str[] = “ab,cd,ef,gh”; char *p ; p = strtok(str,","); if(p != NULL) { printf(“获取的第一个串:%s \n"p); //输出 ab。 } 想获取第二个及以后的需要把str 改成NULL。 p = strtok(NULL,”,"); printf(“获取的第二个串:%s \n”,p); //输出 cd. 再调一次 就输出的是ef。
如果比较多可以这样输出
int i = 1; **//算次数** p = strtok(str,","); if(p != NULL) **//判断是分割好了** { printf("第%d个串为%s \n",i,p); **//输出 ab** } while(1) **//死循环** { i++ **//标记打印串次数。** p = strtok(NULL, ","); if(p != NULL) **//判断后面是否还有子串** { printf("第%d个串为%s \n",i,p); **//输出子串** } else { printf("没有子串了\n"); break; **// 退出循环。** } } **注:想要每次打印出的子串保存 可以定义 一个指针数组。 char *c[10]; 每次分割成功就给C。这样就能保存下来了。**