c/c++中与字符串处理相关的函数
void *memccpy (void *dest, const void *src, int c, size_t n);
从src所指向的对象复制n个字符到dest所指向的对象中。如果复制过程中遇到了字符c则停止复制,返回指针指向dest中字符c的下一个位置;否则返回NULL。
void *memcpy (void *dest, const void *src, size_t n);
从src所指向的对象复制n个字符到dest所指向的对象中。返回指针为dest的值。
void *memchr (const void *s, int c, size_t n);
在s所指向的对象的前n个字符中搜索字符c。如果搜索到,返回指针指向字符c第一次出现的位置;否则返回NULL。
int memcmp (const void *s1, const void *s2, size_t n);
比较s1所指向的对象和s2所指向的对象的前n个字符。返回值是s1与s2第一个不同的字符差值。
int memicmp (const void *s1, const void *s2, size_t n);
比较s1所指向的对象和s2所指向的对象的前n个字符,忽略大小写。返回值是s1与s2第一个不同的字符差值。
void *memmove (void *dest, const void *src, size_t n);
从src所指向的对象复制n个字符到dest所指向的对象中。返回指针为dest的值。不会发生内存重叠。
void *memset (void *s, int c, size_t n);
设置s所指向的对象的前n个字符为字符c。返回指针为s的值。
char *stpcpy (char *dest, const char *src);
复制字符串src到dest中。返回指针为dest + len(src)的值。
char *strcpy (char *dest, const char *src);
复制字符串src到dest中。返回指针为dest的值。
char *strcat (char *dest, const char *src);
将字符串src添加到dest尾部。返回指针为dest的值。
char *strchr (const char *s, int c);
在字符串s中搜索字符c。如果搜索到,返回指针指向字符c第一次出现的位置;否则返回NULL。
int strcmp (const char *s1, const char *s2);
比较字符串s1和字符串s2。返回值是s1与s2第一个不同的字符差值。
int stricmp (const char *s1, const char *s2);
比较字符串s1和字符串s2,忽略大小写。返回值是s1与s2第一个不同的字符差值。
size_t strcspn (const char *s1, const char *s2);
返回值是字符串s1的完全由不包含在字符串s2中的字符组成的初始串长度。
size_t strspn (const char *s1, const char *s2);
返回值是字符串s1的完全由包含在字符串s2中的字符组成的初始串长度。
char *strdup (const char *s);
得到一个字符串s的复制。返回指针指向复制后的字符串的首地址。
char *strerror(int errnum);
返回指针指向由errnum所关联的出错消息字符串的首地址。errnum的宏定义见errno.h。
size_t strlen (const char *s);
返回值是字符串s的长度。不包括结束符'/0'。
char *strlwr (char *s);
将字符串s全部转换成小写。返回指针为s的值。
char *strupr (char *s);
将字符串s全部转换成大写。返回指针为s的值。
char *strncat (char *dest, const char *src, size_t maxlen);
将字符串src添加到dest尾部,最多添加maxlen个字符。返回指针为dest的值。
int strncmp (const char *s1, const char *s2, size_t maxlen);
比较字符串s1和字符串s2,最多比较maxlen个字符。返回值是s1与s2第一个不同的字符差值。
char *strncpy (char *dest, const char *src, size_t maxlen);
复制字符串src到dest中,最多复制maxlen个字符。返回指针为dest的值。
int strnicmp(const char *s1, const char *s2, size_t maxlen);
比较字符串s1和字符串s2,忽略大小写,最多比较maxlen个字符。返回值是s1与s2第个不同的字符差值。
char *strnset (char *s, int ch, size_t n);
设置字符串s中的前n个字符全为字符c。返回指针为s的值。
char *strset (char *s, int ch);
设置字符串s中的字符全为字符c。返回指针为s的值。
char *strpbrk (const char *s1, const char *s2);
返回指针指向字符串s1中字符串s2的任意字符第一次出现的位置;如果未出现返回NULL。
char *strrchr (const char *s, int c);
在字符串s中搜索字符c。如果搜索到,返回指针指向字符c最后一次出现的位置;否则返回NULL。
char *strrev (char *s);
将字符串全部翻转,返回指针指向翻转后的字符串。
char *strstr (const char *s1, const char *s2);
在字符串s1中搜索字符串s2。如果搜索到,返回指针指向字符串s2第一次出现的位置;否则返回NULL。
char *strtok (char *s1, const char *s2);
用字符串s2中的字符做分隔符将字符串s1分割。返回指针指向分割后的字符串。第一次调用后需用NULLL替代s1作为第一个参数。
c中:
//内存分配函数
void* malloc(size_t size);
1 #include <stdio.h> 2 #include <stdlib.h> 3 int main() 4 { 5 int i, n; 6 char *buffer; 7 8 printf("how long do you want the string? "); 9 scanf("%d", &i); 10 11 buffer = (char*)malloc(i+1); 12 if(buffer == NULL) //分配堆内存失败 13 exit(1); 14 memset(buffer, 0, i+1); 15 for(n=0; n<i; n++) 16 { 17 buffer[n] = rand()%26 + 'a'; 18 } 19 buffer[i] = '\0'; 20 21 printf("Random string: %s\n", buffer); 22 free(buffer); 23 return 0; 24 }
//内存填充函数:
void * memset(void *dest, int c, size_t count);
1 #include <stdio.h> 2 #include <string.h> 3 int main() 4 { 5 char str[] = "almost every progreammer should know memset"; 6 memset(str, '-', 6); 7 puts(str); 8 9 return 0; 10 } 11 //输出: ------every progreammer should know memeset;
memcpy
原型:void * memcpy(void * destination, const void * source , size_t num); .//参数是指针;
1 #include <stdio.h> 2 #include <string.h> 3 4 struct { 5 char name[40]; 6 int age; 7 }person, person_copy; 8 9 int main() 10 { 11 char myname[] = "Pierre de Fermat "; 12 //using memcpy to copy string; 13 memcpy(person.name, myname, strlen(myname)+1 ); 14 person.age = 46; 15 16 //using memcpy to copy structure 17 memcpy( &person_copy, &person, sizeof(person)); 18 19 printf("person_copy: %s, %d \n", person_copy.name, person_copy.age ); 20 21 return 0; 22 }
------输出:
person_copy: Pierre de Fermat , 46
//字符串中查找某个字符 函数
char * strchr(const char* , int );
1 #include <stdio.h> 2 #include <string.h> 3 4 int main() 5 { 6 char str[] = "This is a sample "; 7 //char ch = 's'; ----这样也可以的 8 int ch = 's'; 9 char *pch; 10 printf("looking for the 's' character in \"%s\" ...\n", str); 11 12 pch = strchr(str, ch); 13 while(pch != NULL) 14 { 15 printf("%s\n", pch); 16 printf("found at %d\n", pch-str+1); //确定位置 17 pch = strchr(pch+1, 's'); 18 } 19 20 return 0; 21 }
输出:
looking for the 's' character in "This is a sample " ...
s is a sample
found at 4
s a sample
found at 7
sample
found at 12
//字符串分割函数
char *strtok(char *str1, char *str2);
str2的集合, str1 会根据这里的每个字符进行分割
1 //调用 strtok 后, 原字符串会被修改.而且它是确定的,即截取的第一段; 2 #include <stdio.h> 3 #include <string.h> 4 5 int main() 6 { 7 char str[] = " this , a sample, string"; 8 char *pch; 9 char *psh = ","; 10 11 printf("Splitting string \"%s\" into to \n", str); 12 13 pch = strtok(str, psh); //第一次调用, 第一参数为源串;-----参数是指针; 14 while(pch !=NULL) 15 { 16 printf("源字符串被截取之后为:%s\n", str); 17 printf("函数的返回值为:%s\n", pch); 18 pch = strtok(NULL, psh); //第2, 3,。。。。次调用,第一个参数使用NULL 19 } 20 21 return 0; 22 }
输出:
Splitting string " this , a sample, string" into to
源字符串被截取之后为: this
函数的返回值为: this
源字符串被截取之后为: this
函数的返回值为: a sample
源字符串被截取之后为: this
函数的返回值为: string
strcpy //strncpy()
原型:char * strcpy(char * destination, const char * source ); //参数是指针;
原型: char* strncpy(char *destination, const char *source, size_t num); //参数是指针;
1 #include <stdio.h> 2 #include <string.h> 3 4 int main() 5 { 6 char str1[] = "Sample string "; 7 char str2[40]; 8 char str3[40]; 9 10 strcpy(str2, str1); 11 strcpy(str3, "copy successful "); 12 13 printf("str1: %s\n str2: %s\n str3: %s\n ", str1, str2, str3); 14 15 return 0; 16 }
-----输出
str1: Sample string
str2: Sample string
str3: copy successful
c++中
string::c_str()
1.string类成员函数c_str() 的原型:
const char *c_str() const; //返回一个以null终止的c字符串;
2.c_str()函数返回一个指向正规c字符串的指针,内容和string类的本身对象是一样的,通过string类的c_str()函数能够把string对象转换成c中的字符串的样式;
这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。
注意:一定要使用strcpy()函数 等来操作方法c_str()返回的指针
1 char * c; 2 string str = "12345"; 3 c = str.c_str(); ////c最后指向的内容是垃圾,因为s对象被析构,其内容被处理 4 5 应该这样用: 6 char c[20]; 7 string s="1234"; 8 strcpy(c,s.c_str()); 9 这样才不会出错,c_str()返回的是一个临时指针,不能对其进行操作
1 #include <iostream> 2 #include <cstring> 3 #include <string> 4 5 int main() 6 { 7 std::string str("please split this sentense into tokens"); 8 9 char *cstr = new char[str.length()+1]; 10 std::strcpy(cstr, str.c_str()); //c_str()转为指针; 11 12 std::cout <<"cstr = "<< cstr << std::endl; 13 char *p = std::strtok(cstr, " "); 14 while(p != 0) 15 { 16 std::cout << p << '\n'; 17 p = strtok(NULL, " "); 18 } 19 20 delete[] cstr; 21 return 0; 22 }
string::length //等价于 string::size()
原型:size_t length() const;
return length of string
1 #include <iostream> 2 #include <string> 3 4 int main() 5 { 6 std::string str("test string "); 7 std::cout << "the size of str is " << str.length() << " characters. \n"; 8 std::cout << "the size of str is " << str.size() << " characters. \n"; 9 return 0; 10 }
string::resize
原型:void resize(size_t n);
void resize (size_t n, char c);
resize函数用来改变string的大小,如果size小于来string的size大小,则截取前size个字符,如果大于,则用c补充
1 #include <iostream> 2 #include <string> 3 4 int main() 5 { 6 std::string str("I like to code in C"); 7 std::cout << str << std::endl; 8 9 unsigned sz = str.size(); 10 std::cout << sz << std::endl; 11 std::cout << str << std::endl; 12 13 str.resize(sz+2, '+'); 14 std::cout << str << std::endl; 15 16 str.resize(14); 17 std::cout << str << std::endl; 18 str.resize(24); 19 std::cout << str << std::endl; 20 21 return 0; 22 }
-----输出:
I like to code in C
20
I like to code in C
I like to code in C++
I like to code in C++
I like to code