c语言中所有文字必须记录在一组连续的字符类型存储区中,所有文字信息以'\0'字符结束
符合以上两种特征的内容就可以用在c语言中记录文字信息了,叫做字符串
字符串里'\0'字符前面的部分是有效字符
所有字符串都可以用一个字符类型指针表示
字符串字面值是一种字符串,双引号中间包含的一组字符表示,比如:"abc","!@#$%"
编译器在编译的时候会自动在字符串字面值的末尾增加一个'\0'字符
编译器会把字符串字面值替换成第一个字符所在存储区的地址
字符串字面值内容在程序中是不可以修改的,***必须通过数组就行修改***
程序中内容一样的字符串字面值只有一个
char *p = "wu.xiong";
char *p1 = "wu.xiong";
printf("%p\n",p);
printf("%p\n",p1);
内存地址相同(字面值不可修改)
多个并列的字符串字面值会被合并成一个
printf("%p\n","abc") == printf("%p\n","ab""c")
字符数组也可以用来表示字符串
只有包含'\0'字符的字符数组才可以当作字符串使用
可以使用字符串字面值对字符数组进行初始化,这个时候'\0'字符也会被初始化到字符数组中
字符数组里字符串内容可以被修改
不可以使用操作符处理字符串,需要用处理字符串的标准函数;需要包含"string.h"文件
常见操作函数:
strlen(char *p):获取函数的长度(有效字符个数)
sizeof:计算数组的总大小(长度)
strcat(char arr[],char arr[] or char *p):
合并两个字符串,将第二个参数追加到第一个参数的后面,返回值:第一个参数
第一个参数:数组;第二个参数:数组或字符串
如果数组存储区的长度不够,会造成内存泄漏
strncat(char arr[],char arr[] or char *p,int tmp):
功能和strcat功能相同
他比strcat多了一个整数类型的参数,表示数组里空余存储区的个数
可以避免strcat出现的问题
strcmp(char *p1,char *p2):比较两个字符串的大小;
根据ASCII码进行比较大小
1:前面的数大
0:一样大
-1:后面的数大
strncmp:功能和strcmp类似,只比较两个字符串的前n个字符
strcpy(char arr[],char *p):
把一个字符串复制到字符数组中;数组中如果有内容会替换掉
strncpy(char arr[],char *p,int count):
功能同上,多了一个整数参数,表示要复制的字符个数
memset(char *p,char ch,int size): // ch:填充的内容 size:填充的范围
把字符数组里多个存储区填充同一个字符;可用来进行初始化
strstr(char *p1, char *p2):在大字符串里查找小字符串的位置
找不到返回NULL,如果找到,则返回第二个参数内容
字符串输入输出函数:
sprintf(char arr[],"%d%c%f",int,char,float):
把字符按照格式放在字符数组里形成字符串
char buf[20] = {};
int num = 9;
char ch = 'z';
float fn = 2.5f;
strcpy(buf,"v 100 3.2");
sscanf(buf,"%c %d %f",&ch,&num,&fn);
printf("%d %c %g\n",num,ch,fn);
从字符串里获得数字并记录在存储区里
********************************************
将字符串里的数字转换成数字;需要包含stdlib.h头文件
atoi(char *p):把字符串里不带小数点的数字转换成整数类型,必须以数字开头
atof(char *p):把字符串里带小数点的数字转换成双精度浮点类型,必须以数字开头
可以在scanf函数使用%s占位符把 输入的字符串记录到数组里,
但是这个方法可能会造成严重错误
fgets:也可以从键盘得到字符串并记录到数组里,可以避免scanf函数的问题
三个参数:
1.数组名称
2.数组存储区个数
3.用stdin表示键盘
如果输入的数据超出范围,会留在缓冲区中,下次读取会接着读取
如果输入的数据不够,则将输入的换行字符也放入数组中
每次使用fgets函数从键盘得到字符串以后都应该在分支清理输入缓冲区中可能存在的多余数据
指针数组:每个存储区都是一个指针类型的数组
字符指针数组:包含多个字符指针,每个字符指针可以代表一个字符串;可以用字符指针数组代表多个相关字符串
void *memchr(const void *, int, size_t);
int memcmp(const void *, const void *, size_t);
void *memcpy(void *, const void *, size_t);
void *memmove(void *, const void *, size_t);
void *memset(void *, int, size_t);
char *strcat(char *, const char *);
char *strchr(const char *, int);
int strcmp(const char *, const char *);
int strcoll(const char *, const char *);
char *strcpy(char *, const char *);
size_t strcspn(const char *, const char *);
char *strerror(int);
size_t strlen(const char *);
char *strncat(char *, const char *, size_t);
int strncmp(const char *, const char *, size_t);
char *strncpy(char *, const char *, size_t);
char *strpbrk(const char *, const char *);
char *strrchr(const char *, int);
size_t strspn(const char *, const char *);
char *strstr(const char *, const char *);
char *strtok(char *, const char *);
size_t strxfrm(char *, const char *, size_t);
char *strtok_r(char *, const char *, char **);
int strerror_r(int, char *, size_t);
char *strdup(const char *);
void *memccpy(void *, const void *, int, size_t);
char *stpcpy(char *, const char *);
char *stpncpy(char *, const char *, size_t);
char *strndup(const char *, size_t);
size_t strnlen(const char *, size_t);
char *strsignal(int sig);
errno_t memset_s(void *, rsize_t, int, rsize_t);
void *memmem(const void *, size_t, const void *, size_t);
void memset_pattern4(void *, const void *, size_t);
void memset_pattern8(void *, const void *, size_t);
void memset_pattern16(void *, const void *, size_t);
char *strcasestr(const char *, const char *);
char *strnstr(const char *, const char *, size_t);
size_t strlcat(char *, const char *, size_t);
size_t strlcpy(char *, const char *, size_t);
void strmode(int, char *);
char *strsep(char **, const char *);
=====================================
代码片段:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
int i = 0;
for(i = 0; i < argc; i++){
printf("%s\n",argv[i]);
}
int heads = atoi(argv[1]);
int foots = atoi(argv[2]);
printf("heads = %d foots = %d\n",heads,foots);
char ch[50] = {'a','b','c','d'};
char *p = "wu.xiong";
// 获取字符串的有效长度
printf("p.len = %ld\n",strlen(p));
printf("p.sizeof(p) = %ld\n",sizeof(p));
// 字符数组的拼接,将第二个参数拼接到第一个参数的后面
strcat(ch,"bigpanda.com");
for(i = 0; i < 50; i++){
printf("%c",ch[i]);
}
printf("\n");
/*strcmp(char *p1,char *p2):比较两个字符串的大小;
根据ASCII码进行比较大小
1:前面的数大
0:一样大
-1:后面的数大
*/
printf("strcmp :%d\n",strcmp("a","b"));
//把2个字符串复制到字符数组中;数组中如果有内容会替换掉
strcpy(ch,".");
for(i = 0; i < 50; i++){
printf("%c",ch[i]);
}
printf("\n");
// 初始化数组 B:初始化的内容,50:初始化的范围
memset(ch,'B',10);
printf("memset...\n");
printf("%s\n",ch);
//strstr(char *p1, char *p2):在大字符串里查找小字符串的位置
//找不到返回NULL,如果找到,则返回第二个参数内容
/*
将字符串里的数字转换成数字;需要包含stdlib.h头文件
atoi(char *p):把字符串里不带小数点的数字转换成整数类型,必须以数字开头
atof(char *p):把字符串里带小数点的数字转换成双精度浮点类型,必须以数字开头
*/
//把字符按照格式放在字符数组里形成字符串,但是不会打印出来
char sp[50] = {0};
sprintf(sp,"%d %d %f",12,100,12.34);
printf("p :%s\n",sp);
// 获取键盘输入的字符
char buff[10] = {0};
printf("请从键盘输入字符\n");
fgets(buff,10,stdin);
printf("buff = %s\n",buff);
if(strlen(buff) == 9 && buff[8] != '\n'){
scanf("%*[^\n]");
scanf("%*c");
}
printf("请从键盘输入字符\n");
fgets(buff,10,stdin);
printf("buff = %s\n",buff);
return 0;
}