本文讲解C语言里字符串的处理函数
常用的字符串函数有:
int strlen(char *str);
返回字符串的长度,不包括结尾的0,比如"abc\0"的长度为3
int len;
char str[] ="1234567890";
len =strlen(str); // len为10
char b=str[len-1]; // b为'0'
strcpy(char *dest_str, char *src_str);
复制src_str到dest_str,dest_str分配的空间大小要比src_str大或相等Mssq字符串函数,会自动在dest_str后添加一个0,所以dest_str分配的空间长度至少要比src_str字符串的长度大1
比如
char abc[5];
strcpy(abc, "hello");
则会导致内存错误,因为hello的长度为5,"hello"实际分配的空间为6,因为是字符串,后面要自动带一个0表明字符串的截止,所以abc分配的空间大小也要为6,复制"hello"过去后自动在后面添加一个0
strncpy(char *dest_str, char *src_str, int copy_len);
这个函数复制src_str的copy_len长度的一部分字符到dest_str,不会自动在dest_str的后面加0,一般要自己手动在后面加0:
char abc[6];
strcpy(abc, "hello world", 5);
abc[5] =0;
复制"hello"到abc
char *strcat(char *str, char *str_add);
strcat将str_add字符串复制到str的尾部,要注意str字符串分配的空间一定要能把str_add添加过来。
strncat是将一个字符串的某段长度的内容添加过来
char *strstr(char *str, char *sub_str);
strstr函数用来查找子串:
char *abc ="hello world!";
char *p =strstr(abc, "hello");
char *p2 =strstr(abc, "world");
此时p指向的是"hello world!",p2指向的是"world!"
我们可以使用指针相减得到一个子串:
char *abc ="1234567890";
char *p =strstr(abc, "567"); //p="567890"
char str[20];
strncpy(str, abc, p-abc); //p-abc=4
str[p-abc] =0;
此时指针的位置"(abc)1234(p)567890",所以p-abc则是4,strncpy(str, abc, p-abc)则是复制abc的4个字符到str,也就是"1234",str[p-abc] =0则是str[4] =0;
char *strchr(char *str, char c);
是在字符串str中查找字符c,比如下面一个创建各级目录的程序:
char *path="c:\\test\\test2\\test3";
char path2[256];
char *p = path, *p2;
while (*p)
{
p2 =strchr(p, '\\');
if (p2)
{
strncpy(path2, path, p2 - path);
path2[p2 - path] = 0;
if (path2[0] != 0)
if (_access(path2, 0) != 0 && _mkdir(path2) != 0)
return -1;
// printf("create path %s failed!\n", path2);
}else break;
p =p2+1;
}
if (_mkdir(path) != 0) return -1;
此代码一级一级的查找子目录,一个一个的创建它。
char *strrchr(char *str, char c);
strrchr从右边查找c,或者说查找最后一个c
int strcmp(char *str1, char *str2);
strcmp比较两个字符串,如果两个字符串完全相同,则返回0,大写小写为不同的字母。
int stricmp(char *str1, char *str2);
stricmp函数比较两个字符串,忽略大小写,大写和小写字母视同相同字母
strncmp和strnicmp是比较两个字符串,但限定比较某个长度内
char *strtok(char *buf, char *searchs);
strtok函数查找buf中的searchs包含的任一个字符,找到就将此位置设为0,返回值指向找到的位置的前面的字符串,没找到则返回NULL,如果buf为NULL则表示从当前找到的位置继续查找,比如下面的例子:
char *str="abc|222|fff\n";
char sub_str[3][10];
char *p =strtok(str, "|"); // 找到第一个|并改为0,str变成"abc\0222|fff",p指向str
strcpy(sub_str[0], p); // p指向str,实际使用的时候一般要判断p是否为空: if(p)
p =strtok(NULL, "|"); // 从刚才\0也就是NULL的位置继续查找,找到就填0,返回前面的字符串
strcpy(sub_str[1], p); // p是"222";
p =strtok(NULL, "|); p是"fff\n";
strcpy(sub_str[2], p);
strtok(sub_str[2], "\r\n"); // 截取掉后面的\r和\n, sub_str[2]变成"fff"
p =strtok(NULL, "|"); // 此时p就是NULL了
我们也可以使用strchr实现上面的代码:
char *str="abc|222|fff\n";
char sub_str[3][10];
char *p, *p2;
p =strchr(str, '|'); // p为"|222|fff\n"
*p =0; // 把'|'替换为\0,截断字符串
strcpy(sub_str[0], str); // str变成了"abc"
p2 =p+1; // p2越过刚才的\0,指向"222|fff\n"
p =strchr(p2, '|'); // 查找第二个'|', p是"|fff\n"
*p =0; // p2变成了"222";
strcpy(sub_str[1], p2);
p2 =p+1; // p2为"fff\n"
strcpy(sub_str[2], p2);
strtok(sub_str[2], "\r\n"); // 截取掉后面的\r和\n, sub_str[2]变成"fff"
strtok函数在多线程下使用可能会冲突,要用strtok_s函数代替
char *strlwr(char *str);
strlwr将一个字符串转换为小写
char *strupr(char *str);
strupr将一个字符串转换为大写
sprintf(char *buf, char *fmt, ...);
sprintf将各种类型的数据结合格式输出fmt,转换到字符串buf,如果要把很多不同类型的数据整合一起输出,一般都是用sprintf函数:
int num=10;
char *name="XiaoMing";
int age=20;
char buf[100];
sprintf(buf, "user name: %s, num %d, age %d", name, num, age);
atoi和itoa函数, atof, ftoa函数,字符串和整型、浮点型数据转换
(编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|