指针-指针得到的是指针之间的元素个数,不是字节个数
字符串追加 strcat 和strncat
自己给自己追加的时候,strcat会崩溃因为首字母是把\0替换掉
strncat就可以
strcat(Den , Sour);
strncat(Den,sour,count);
strstr(Den,Sour)找子串的 如果找到了返回Den字符的地址,找不到返回空指针
字符串---常量字符串,字符串数组 ,如果能成为字符串,则字符串的末尾必定会存放一个\0;
字符串长度--strlen
strlen的返回值是size_t(是无符号整形)
长度不受限制的字符串---strcpy,strcmp,strcat
strcpy注意事项,1. 源地址必须要以'\0'结束,并且拷贝的时候会把'\0'拷贝到目标空间去 2. 目标空间必须足够大,确保源字符串能够存储 3.目标空间必须可变
//该arr1不可变,因为arr1内是常量字符串
char *arr1="abcdef";
//该arr2里可变
char arr2[]="abcdef";
strcat注意事项,1. 目标空间必须足够大,确保源字符串追加在目标字符串处仍能存储 2. 源头和目的地都要包含'\0',而且源头的'\0'会拷贝到目的地中。
strcmp注意事项 1. arr1>arr2返回大于零的数,arr1<arr2返回小于零的数 arr1=arr2返回零,返回类型是int
长度受限制的字符串---strncat,strncpy,strncmp
char* strncpy(const char* str1,const char* str2, size_t count)
strncpy :拷贝num个字符,从源字符到目标空间
如果源字符串的长度小于num,则拷贝完字符串后,在目标的后面追加0直到num个
char* strncat(const char* str1,const char* str2, size_t count)
strncat: 追加n个字符,如果追加的n比arr2要短,追加之后自动补一个‘\0’,如果比arr2要长,则追加arr2之后补一个‘\0’之后就不管了。
int strncmp(const char* str1,const char* str2, size_t count)
strncmp : 比较到一个字符串结束或者出现另个字符不一样或者num个字符全部比较完。
字符串查找---strstr,strtok
strstr :查找字符串 如果没有查找到返回的是空指针,如果查找到了,返回的是查找到的字符串的地址
int main() {
char* p1 = "abcdefabcdef";
char* p2 = "de";
char* ret = strstr(p1, p2);//返回的是defabcdef ,返回的是在p1中首次出现的字符串地址,打印p1后面的所有元素
if (ret==NULL) {
printf("查不到该字串");
}
else {
printf("%s\n",ret);
}
return 0;
}
strtok
char* strtok(char* str,const char* sep)
sep参数是个字符串,定义了用作分隔符的字符集合
注意事项:
- 第一个参数指定一个字符串,他包含了0个或者多个由sep字符串中1个或者多个分隔符的标记
- strtok找到str中的下一个标记,并将其用'\0'结尾,返回一个指向这个标记的指针(strtok会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可以修改)
- 若strtok函数第一个参数不为NULL时,函数将找到str中的第一个标记,str函数将保存他在字符串中的位置
- 若strtok函数第一个参数为NULL时,函数将在同一个字符串中被保存的位置开始找下一个标记
- 如果字符串不存在更多的标记,则返回NULL指针
- 第一个参数为NULL的strtok函数会匹配距离它最近的第一个参数不是NULL指针的strtok。
错误信息报告---strerror
char* strerror(int errnum);
strerror:返回错误码对应的信息
int main() {
//错误码 错误信息
//0 - No error
//1 - Operation not permitted
//2 - No such file or directory
//... ...
//全局的错误变量/错误码的变量
//当c语言的库函数在执行过程中,发生了错误,就会把对应的错误码赋值到errno中
/*char* arr = strerror(errno);
printf("%s\n", arr);*/
FILE* pf=fopen("text.txt","r");
if (pf==NULL)
{
printf("%s\n", strerror(errno));
}
else
{
printf("open file success");
}
return 0;
}
字符分类函数
字符做操作
int main() {
char ch = 'w';
//如果是小写字母返回非零值,如果不是小写字符返回0;
int ret = islower(ch);
//十进制数字0-9
int ret1 = isdigit(ch);
//空白字符“空格” 换页"\f" 换行"\n" 回车"\r" 制表符"\t" 垂直制表符"\v"
int ret1 = isspace(ch);
//十六进制包括a-f A-F
int ret1 = isxdigit(ch);
//任何控制字符
int ret1 = iscntrl(ch);
//大写字母A-Z
int ret1 = isupper(ch);
//字母a-z,字母A-Z
int ret1 = isalpha(ch);
//字母或者数字 a-z,字母A-Z 数字0-9
int ret1 = isalnum(ch);
//标点符号,任何不属于数字或者字母的图形字符
int ret1 = ispunct(ch);
//任何图形字符
int ret1 = isgraph(ch);
//任何可打印字符包括图形字符和空白字符
int ret1 = isprint(ch);
int ret1 = printf("%d\n", ret);
//字符转换
//tolower--转小写字母
//toupper--转大写字母
//如果是小写不动,大写转化为小写
char ch = tolower('Q');
//printf("%c\n",ch);
putchar(ch);
return 0;
}
strcat strcpy strcmp---操作对象是字符串 ‘\0’
整形数组,浮点型数组,结构体数组就不能用'\0'了;
内存操作函数---memcpy,memmove,memset,memcmp
memcpy -- 内存拷贝:即能拷贝整形,浮点型,结构体,字符串
void* mencpy(void* dest,const void* source,size_t num/*单位是字节*/)
如果使用memcpy拷贝时,两个字符串要是有交集,因为会被覆盖(但是可以成功,vs2013可以胜任这个工作)---c语言标准,memcpy只要处理,不重叠的内存拷贝就可以
memmove -- 处理重叠内存的拷贝
void* men(void* dest,const void* source,size_t num/*单位是字节*/)
memcmp---内存比较,比较结果和strcmp的结果是一样的
void* mencmp(void* dest,const void* source,size_t num/*单位是字节*/)
int main() {
int arr1[] = { 1,2,3,5,6,7,8,9 };
int arr2[] = { 1,2,3,6,3,1,0,9 };
int ret = memcmp(arr1, arr2, 8);//8的单位是字节---结果是0---如果输入的是16则arr1和arr2的第四个不相同则会返回-1
printf("%d\n", ret);
return 0;
}
memset---设置一个缓冲区为一个特定的字符
void* memset(void* dest,int c,size_t count)
dest----是目标字符串(那块空间进行设置) c-----设置的字符是什么 count-----要设置多少个字符
注意事项----count的单位是字节
int main() {
char arr[10] = "";
int arr1[10] = { 0 };
memset(arr,'*',7);
//01 01 01 01 01 01 01 01 01 01 00 00 00 00 00 00...
memset(arr1, 1, 10);//这种情况只能改掉前两位,和第三位的前两个字节,而且输出的之是16843009,并不是1
return 0;
}
NULL---空指针
NUL/Null---‘\0’;