1.strcpy 字符串拷贝:charstrcpy(char dest, constchar* src );
2.strncpy 字符串固定字符拷贝:charstrncpy(char dest,constchar* src, size_t num );
3.strcat 字符串连接:char * strcat ( char * dest, const char * src);
4.strncat 字符串固定字符连接char * strncat ( char * dest, const char * src, size_t num );
5.strcmp 字符串比较:int strcmp ( const char * str1, const char * str2 );
6.strchr 字符串中字符查找:const char * strchr ( const char * str, int character );
7.strstr 字符串中字符串查找:const char * strstr ( const char * str1, const char * str2 );
8.strlen 字符串长度:size_t strlen ( const char * str );
9.memset 字符串初始化或者批量重置:void * memset ( void * ptr, int value, size_t num );
strcpy的作用是复制整个字符数组到另一个字符数组,因此也就非常简洁,只有两个参数:
char * strcpy ( char * destination, const char * source );
前一个是要复制到的目标数组起始位置,后一个是被复制的源数组起始位置。使用也非常简单,下面就用一个例子来说明.
int main () {
char str1[] = "Sample string";
char str2[40];
char str3[40];
strcpy (str2, str1);
strcpy (str3, "copy successful");
printf ("str1: %snstr2: %snstr3: %sn", str1, str2, str3);
return 0;
}
strncpy与strcpy很类似,只是可以指定复制多少个字符。它的原型是:
char * strncpy ( char * destination, const char * source, size_t num );
显前两个参数的含义与strcpy相同,第三个参数num就是要复制的字符个数。需要注意的是因为是部分复制,所以该函数不会帮你添加’0’,要记得在调用完之后自己添加一个。
int main () {
char str1[] = "To be or not to be";
char str2[40];
char str3[40];
/* 整个字符串进行复制: */
strncpy ( str2, str1, sizeof(str2) );
/* 部分复制(这里是复制5个字符): */
strncpy ( str3, str2, 5 );
str3[5] = '0'; /* 添加结尾符 */
puts (str1);
puts (str2);
puts (str3);
return 0;
}
strcat的功能是把一个字符串连接到另一个字符串的后面。
char * strcat ( char * destination, const char * source );
前一个是目标字符串,后一个是要添加到后面的源字符串。
int main () {
char str[80];
strcpy (str, "these ");
strcat (str, "strings ");
strcat (str, "are ");
strcat (str, "concatenated.");
puts (str);
return 0;
}
根据strcpy和strncpy之间的关系,应该猜到,该函数是可以指定字符个数进行连接。
char * strncat ( char * destination, const char * source, size_t num );
int main () {
char str1[20];
char str2[20];
strcpy (str1, "To be ");
strcpy (str2, "or not to be");
strncat (str1, str2, 6);
puts (str1);
return 0;
}
3.1. strcmp
对两个字符数组我们不能直接if (s > t)这样比较,要这样比较的是两个字符数组的指针的地址。因此要用到strcmp函数。
int strcmp ( const char * str1, const char * str2 );
两个参数是要比较大小的字符数组,返回值是它们的大小关系。具体方式是:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’0’为止。
如果str1和str2相等则返回0;
如果str1小于str2则返回小于零,如果str1大于str2,则返回大于零。
int main () {
char key[] = "apple";
char buffer[80];
do {
printf ("Guess my favorite fruit? ");
fflush (stdout);
scanf ("%79s",buffer);
} while (strcmp (key,buffer) != 0);
puts ("Correct answer!");
return 0;
}
输出结果:
Guess my favourite fruit? orange
Guess my favourite fruit? apple
Correct answer!
test1.Compare(test2) == 0
strchr函数可以在一个字符串里找某个字符第一次出现的位置。
const char * strchr ( const char * str, int character );
前一个是原字符串,后一个是要查找的字符。
int main () {
char str[] = "This is a sample string";
char * pch;
printf ("Looking for the 's' character in "%s"...n", str);
pch = strchr(str, 's');
while (pch ! =NULL) {
printf ("found at %dn", pch - str + 1);
pch = strchr(pch + 1, 's');
}
return 0;
}
输出:
Looking for the ‘s’ character in “This is a sample string”…
found at 4
found at 7
found at 11
found at 18
4.2 strstr
strstr函数可以在一个字符串里查找另一个字符串第一次出现的位置。
const char * strstr ( const char * str1, const char * str2 );
其中前一个是文本串,后一个是模式串。
int main () {
char str[] = "This is a simple string";
char * pch;
pch = strstr (str, "simple");
strncpy (pch, "sample", 6);
puts (str);
return 0;
}
输出:
This is a sample string。
strlen用于求一个字符数组的长度,注意它是从给定的起始位置开始不断往后尝试,直到遇到’0’为止的,因此它的时间复杂度并不是常数级别的,而是取决于字符数组的长度,在字符数组没有变动的情况下请务必不要重复调用。
size_t strlen ( const char * str );
那么参数毋庸置疑自然就是要求长度的字符数组了。
int main () {
char szInput[256];
printf ("Enter a sentence: ");
gets (szInput);
printf ("The sentence entered is %u characters long.n", (unsigned)strlen(szInput));
return 0;
}
memset是一个非常好用的函数,不仅在字符串方面。它可以把连续一段区间的内存修改成同一个值,以字节为单位。而一个字符正好就是一个字节,这也就让memset可以很好的为字符串的区间修改提供服务。
void * memset ( void * ptr, int value, size_t num );
ptr指向要修改的内存块的起始地址,value是要修改成什么值,num是修改多少个。
int main () {
char str[] = "almost every programmer should know memset!";
memset (str, '-', 6);
puts (str);
return 0;
}