求字符串长度
strlen 查询字符串长度
strlen(字符串名字);
#define _CRT_SECURE_NO_WARNINGS 1 #include#include int main() { char arr[] = "abcd"; int len = strlen(arr); printf("%d", len); return 0; }
模拟strlen函数实现
int My_strlen(const char * p) { int i = 0; assert(p != NULL); while (*p != '') { i++; p++; } return i; }
注如果定义的是{}这样形式的字符串数组,会出现错误,因为没有
字符串以及‘’作为结束标志,strlen函数返回的是在字符串中‘’前面出现的字符个数(不包含‘’)
参数指向的字符串必须要以‘’结束。
注意函数的返回值是size_t,是无符号的
且两个无符号数相减,也是没有负数的
长度不受限制的字符串函数
strcpy 这个函数把字符串复制到一分配好的字符串空间中,复制的时候包括标志字符串结尾的空字符一起复制。 *** 作成功,返回这个字符
strcpy(字符串1, 字符串2);
注:当字符串中没有时不能运行,同时字符串2也不能超过字符串1的长度
char str1[] = "abcdef"; char str2[] = "1234"; strcpy(str1, str2); printf("%sn", str1);
源字符串必须以''结束
会将源字符串中的''拷贝到目标空间
目标空间必须足够大,以确保能存放源字符串
目标空间必须可变
模拟实现strcpy函数
void mystrcpy(char* str1, char const* str2) { assert(str1 != NULL); assert(str2 != NULL); while (*str2 != '') { *str1 = *str2; str1++; str2++; } *str1 = *str2; }
strcat 字符串追加/连接函数,它的功能就是在一个字符串后面追加上另外一个字符串。
strcat(字符串1, 字符串2)
char str1[20] = "abcdef "; char str2[] = "1234"; strcat(str1, str2);
源字符串必须以''结束
目标空间必须足够大,以确保能存放源字符串
目标空间必须可变
模拟实现strcat函数
void mystrcat(char* str1, char const* str2) { assert(str1 != NULL); assert(str2 != NULL); while (*str1 != '') { str1++; } while (*str2 != '') { *str1 = *str2; str1++; str2++; } *str1 = *str2; }
strcmp 用来比较两个字符串
strcmp(字符串1,字符串2)
int main() { char str1[] = "abci"; char str2[] = "abc"; int ret1 = strcmp(str1, str2); printf("%dn", ret1); }
大于0是字符串1大于字符串2
小于0是字符串1小于字符串2
等于0是字符串1等于字符串2
int mystrcmp(char const* str1, char const* str2) { while (1) { int x = *str1 - *str2; if (x > 0) { return 1; } else if (x<0) { return -1; } if (*str1 =='' && *str2 == '') { return 0; } str1++; str2++; } }
长度受限制的字符串函数
这些都和上面的差不多,只不过有了长度要求,其中n就是对长度的要求
strncpy
strncpy(字符串1,字符串2,拷贝的字符个数);
int main() { char str1[20] = "abcd"; char str2[] = "123"; strncpy(str1, str2, 2); printf("%sn", str1); }
模拟实现strncpy函数
char* mystrncpy(char* str1, char const * str2, int n) { assert(str1 != NULL); assert(str2 != NULL); for (int i = 0; i < n; i++) { *(str1+i) = *(str2+i); if (*str2 == '') *str1 = ''; } }
strcat
strncmp
字符串查找
strstr 在一个字符串中找另外一个字符串
strstr(字符串1,字符串2)
int main() { char str1[] = "abcdef"; char str2[] = "abc"; char* ret1 = strstr(str1, str2); if (ret1 == NULL) { printf("没找到"); } else { printf("找到了"); } return 0; }
模拟实现strstr函数
char * mystrstr(const char* str1, const char* str2) { assert(str1 && str2); int count = 0; char* p = str2; while (1) { while (*str1 == *str2) { count++; str1++; str2++; } str1 = str1 - count; if (*str2 != '') { str2 = p; count = 0; } else { return str1 - count; } if (*str1 == '') { return NULL; } str1++; } }
strtok 用来切割字符串
char * strtok (char * str,const char * sep)
sep参数是个字符串,定义了用作分隔符的字符集合
第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或多个分隔符分割的标记
strtok函数找到str中的下一个标记,并将其用结尾,返回一个指向这个标记的指针
(注:strtok函数会改变 *** 作符的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改)
strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串的位置
strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记
如果字符串中不存在更多的标记,则返回NULL指针
int main() { char str[] = "abcdiu/sfffgh*avavdv-gigqv"; char* p = "/*-"; char* ret = NULL; char newstr[50] = { 0 }; strcpy(newstr, str); for (ret=strtok(newstr,p);ret != NULL;ret=strtok(NULL,p)) { printf("%sn", ret); } }
错误信息报告
strerror 返回错误码,所对应的错误信息
使用库函数的时候
调用库函数失败的是,都会设置错误码
全局的错误码
#include
strerror(errno);
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)