C字符串函数介绍
1、strlen
size_t strlen(const char *str);
f返回字符串str的长度,不包含‘\0’
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//计算字符串长度,不包含\0 返回无符号整形
int main()
{
const char *str1 = "abcdef";
const char *str2 = "abc";
if (strlen(str1) > strlen(str2))
{
printf("str1 > str2\n");
}
else
{
printf("str1 < str2");
}
system("pause");
return 0;
}
2、strcpy
char* strcpy(char *destination, const char *source);
将source复制到destination中 destination必须足够大
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//strcpy 将source复制到destination中 destination必须足够大
int main()
{
char str1[] = "sample string";
char str2[20];
char str3[40];
strcpy(str2, str1);
strcpy(str3, "copy successful");
printf("%s\n", str1);
printf("%s\n", str2);
printf("%s\n", str3);
system("pause");
return 0;
}
3、strcat
char* strcat(char *destination, const char *source);
将source追加到destination中 destination必须足够大
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//strcat 将source追加到destination中
int main()
{
char ch[20] = "\0";
strcat(ch, "I ");
strcat(ch, "am ");
strcat(ch, "a ");
strcat(ch, "student!");
puts(ch);
putchar("\n");
char str[80] = "\0";
strcpy(str, "these ");
strcat(str, "strings ");
strcat(str, "are ");
strcat(str, "concatenated.");
puts(str);
system("pause");
return 0;
}
4、strcmp
int strcmp(const char *str1, const char *str2);
比较两个字符串是否相等,相等返回0 前者大返回正数,后者大返回负数
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//strcmp 比较两个字符串是否相等,相等返回0 前者大返回正数,后者大返回负数
int main()
{
const char *str1 = "abcde";
const char *str2 = "abcd";
if (strcmp(str1, str2) == 0)
{
printf("str1 == str2\n");
}
else if (strcmp(str1, str2) >=0)
{
printf("str1 >= str2\n");
}
else
{
printf("str1 <= str2\n");
}
system("pause");
return 0;
}
5、strncpy
char* strncpy(char *destination, const char *source, size_t num);
从source拷贝num个字符到destination
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//strncpy 从source拷贝num个字符到destination
int main()
{
char str1[] = "sample string";
char str2[20] = "\0";
char str3[40] = "\0";
strncpy(str2, str1, 7);
strncpy(str3, "copy successful", 5);
puts(str1);
puts(str2);
puts(str3);
system("pause");
return 0;
}
6、strncat
char* strncat(char *destination, const char *source, size_t num);
从source中追加num个字符到destination
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//strncat 从source中追加num个字符到destination
int main()
{
char str1[20] = "\0";
char str2[20] = "\0";
strcat(str1, "abcdef");
strcat(str2, "abc");
strncat(str1, str2, 2);
puts(str1);
system("pause");
return 0;
}
7、strncmp
int strncmp(const char *str1, const char *str2, size_t num);
比较两个字符前num个字符是否一致 一致返回0,前者大返回正数,后者大返回负数
这个函数开始比较每个字符串的第一个字符。
如果它们彼此相等,则继续执行以下操作,
直到字符不同为止,直到到达一个终止的空字符,
或者直到两个字符串中的num字符匹配为止
(以先发生的情况为准)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//strncmp 比较两个字符前num个字符是否一致 一致返回0,前者大返回正数,后者大返回负数
/*
这个函数开始比较每个字符串的第一个字符。
如果它们彼此相等,则继续执行以下操作,
直到字符不同为止,直到到达一个终止的空字符,
或者直到两个字符串中的num字符匹配为止
(以先发生的情况为准)*/
int main()
{
char str[][5] = { "R2D2", "C3PO", "R2A6" };
int n;
puts("Looking for R2 astromech droids...");
for (n = 0; n < 3; n++)
if (strncmp(str[n], "R2xx", 2) == 0)
{
printf("found %s\n", str[n]);
}
system("pause");
return 0;
}
8、strstr
char* strstr(const char *str1, const char *str2);
查找子字符串
返回一个指向str1中第一次出现的str2的指针,如果str2不是str1的一部分,则返回一个空指针。
匹配过程不包括终止的空字符,但它就到此为止。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//查找子字符串
//返回一个指向str1中第一次出现的str2的指针,如果str2不是str1的一部分,则返回一个空指针。
//匹配过程不包括终止的空字符,但它就到此为止。
int main()
{
char str1[] = "This is a simple string";
char *pstr;
pstr = strstr(str1, "simple");
strncpy(pstr, "simple", 6);
puts(str1);
system("pause");
return 0;
}
9、strtok
char * strtok ( char * str, const char * delimiters );
将字符串按delimiters 分隔为令牌
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#if 0
//strtok 将字符串按delimiters 分隔为令牌
int main()
{
char str[] = "-This , a sample strling.";
char *pstr;
printf("splitting string \ %s \"into tokens:\n", str);
pstr = strtok(str, ",.-");
while (pstr != NULL)
{
printf("%s\n", pstr);
pstr = strtok(NULL, ",.-");
}
system("pause");
return 0;
}
#endif
#if 0
int main()
{
char *p = "[email protected]";
const char* sep = ".@";
char arr[30];
char *str = NULL;
strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容
for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
{
printf("%s\n", str);
}
system("pause");
return 0;
}
#endif
10、strerror
char* strerror(int errnum);
返回错误码,所对应的错误信息
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
//strerror返回错误码,所对应的错误信息
int main()
{
FILE *pFile;
pFile = fopen("unexist.ent", "r");
if (pFile == NULL)
{
printf("Error opening file unexist.ent:%s\n", strerror(errno));
//errno:Last error number
}
system("pause");
return 0;
}
11、字符分类函数
函数 | 如果他的参数符合下列条件就返回真 |
---|---|
iscntrl | 任何控制字符 |
isspace | 空白字符:空格‘ ’,换页‘\f’,换行’\n’,回车‘\r’,制表符’\t’或者垂直制表符’\v’ |
isdigit | 十进制数字 0~9 |
isxdigit | 十六进制数字,包括所有十进制数字,小写字母af,大写字母AF |
islower | 小写字母a~z |
isupper | 大写字母A~Z |
isalpha | 字母az或AZ |
isalnum | 字母或者数字,az,AZ,0~9 |
ispunct | 标点符号,任何不属于数字或者字母的图形字符(可打印) |
isgraph | 任何图形字符 |
isprint | 任何可打印字符,包括图形字符和空白字符 |
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//towler 转换为小写字母
//toupper 转换为大写字母
int main()
{
int i = 0;
char str[] = "I AM A STUDENT!\n";
char c;
while (str[i])
{
c = str[i];
if (isupper(c))
{
c = tolower(c);
}
putchar(c);
i++;
}
system("pause");
return 0;
}
12、memcpy
void* memcpy(void *destination, const void *source, size_t num);
将source位置开始向后复制num个字节得到数据到destination中。
memmove和memcpy的区别是memcpy处理源内存块和目标内存块的时候不可以重叠,若是发生重叠,导致复制结果未定义。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//将source位置开始向后复制num个字节得到数据到destination中。
//memmove和memcpy的区别是memcpy处理源内存块和目标内存块的时候不可以重叠,若是发生重叠,导致复制结果未定义。
struct Student
{
char name[20];
int age;
}person, person_copy;
int main()
{
char myname[] = "Pierre de Fermat";
/*using memcpy to copy string:*/
memcpy(person.name, myname, sizeof(myname) + 1);
person.age = 23;
/*using memcpy to copy structure:*/
memcpy(&person_copy, &person, sizeof(person));
printf("person_copy:%s,%d\n", person_copy.name, person_copy.age);
system("pause");
return 0;
}
13、memmove
void* memmove(void *destination, const void *source, size_t num);
将source位置开始向后复制num个字节得到数据到destination中。
memmove和memcpy的区别是memmove处理源内存块和目标内存块的时候可以重叠
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//将source位置开始向后复制num个字节得到数据到destination中。
//memmove和memcpy的区别是memmove处理源内存块和目标内存块的时候可以重叠
int main()
{
char str[] = "memmove can be very useful……";
memmove(str + 20, str + 15, 11);
puts(str);
system("pause");
return 0;
}
14、memcmp
int memcmp(const char *str1, const char *str2, size_t num);
比较两个字符串的前num个字符是否相等,相等返回0,str1>str2返回1,str1<str2返回-1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char buffer1[] = "DWgaOtP12df0";
char buffer2[] = "DWGAOTP12DF0";
int n;
n = memcmp(buffer1, buffer2, sizeof(buffer1));
if (n > 0)
{
printf("'%s' is greater than '%s'.\n", buffer1, buffer2);
}else if (n<0)
{
printf("'%s' is less than '%s'.\n", buffer1, buffer2);
}
else
{
printf("'%s' is the same as '%s'.\n", buffer1, buffer2);
}
system("pause");
return 0;
}