首页 > 代码库 > 处理字符串的函数 (1)

处理字符串的函数 (1)

/*本篇博客内出现的所有知识点请参考《c++参考大全》*/
#if 0
//#include<iostream>
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<iostream>

//iscntrl是否为控制字符,0~31 和 0X7F都属于控制字符。
//Q1:控制字符是做什么用的?控制字符的使用举例?

//isalnum 字符或者数字
//isalpha,isupper,islower
//isdigit
//isxdigit , 是否为十六进制字符,包括0~9,A~F,a~f
//isgraph,是否为可打印字符,不含空格,一般都在0X21~0X7E之间
//isprint,是否为可打印字符,包括空格 ,一般都在0X20~0X7E之间
//ispunct,是否为标点字符,不含字母,数字,空格 punctuation (标点)

/********************************************************************
int main()
{
unsigned char arr[128] = {0};
for(unsigned char i=0; i<128; i++)
arr[i] = i;

int a = 0; //num&char62
int b = 0; //char52
int c = 0;//A26
int d = 0;//a26
int e = 0;//num10
int f = 0;//0X num10+12
int g = 0;//graph94
int h = 0;//print 95 32~126
int j = 0;//punct 32
int k = 0;//contrl33 0~31 、127
int l = 0;//space 6

for(int i =0; i<128; i++)
{
if(isalnum(arr[i])) a++;
if(isalpha(arr[i])) b++;
if(isupper(arr[i])) c++;
else if(islower(arr[i])) d++;
if(isdigit(arr[i])) e++;
if(isxdigit(arr[i])) f++;
if(isgraph(arr[i])) g++;
if(isprint(arr[i])) h++;
if(ispunct(arr[i])) j++;
if(iscntrl(arr[i])) k++;
if(isspace(arr[i])) l++;
}
return 0;
}
*************************************************************************/
//isspace ,是否为空格‘ ‘,横向制表符‘\t‘,纵向制表符‘\v‘,回车‘\r‘,换页‘\f‘,换行符‘\n‘
//Q2:上述这些字符都是哪些?

//void *memchr(const void*buffer,char ch,size_t count)查找前count个字符中,第一次ch出现的位置,返回指针
//Q3: size_t代表什么类型?
/************************************************************************
int main()
{
char buf[] = "abcdrfghijklmnhitjoaarn";
int n = strlen(buf);
char ch = ‘k‘;
char * p = (char*)memchr(buf,ch,12);
int buf2[13] = {1,2,3,4,5,6,7,8,123,456,678,976,23};
int *q = (int*)memchr(buf2,678,sizeof(int)*11);
// memset(buf,123126,n);
memset(buf,126,n);
buf[n] = ‘\0‘;
printf("%s\n",buf);

// memset(buf2,255,sizeof(int)*13);
// memset(buf2,256,sizeof(int)*13);
memset(buf2,128,sizeof(int)*13);
for(int i=0; i<13; i++)
{
printf("%d ",buf2[i]);
}
printf("\n");

return 0;
}
*****************************************************************/
//int memcmp(const void*buf1,const void *buf1,size_t count)比较count个字符,返回负数,0 ,正数
//void * memset(void *buf,int ch,size_t count),将buf前 count个字符置为ch的低位字节

//void * memcpy(void *to,const void *from,size_t count),拷贝
//如果数组发生重叠,拷贝的结果将不确定
//Q4:拷贝正确和拷贝错误在什么情况下发生?发生的原因是什么?如何避免这样的后果?

//void * memmove(void *to,const void *from,size_t count)
//如果发生重叠,结果仍然正确,但是from的值会改变
//Q5:为什么from的值改变?如果使用(打印)from的值,仍然是改变后的值吗?

// void* strcat(void *to,const void *from) 将from指向的字符赋值给to 指向的包括\0‘以后的字符
//但是数组发生重叠,执行结果不确定。strcat不进行边界检查。

//char* strchr(const char* str,char ch) 查找字符串,返回ch第一次出现的位置指针
//char* strrchr(const char*str,char ch)查找字符串,返回ch最后一次出现的位置指针
//int strcmp(const char* str1,const char *str2)

//int strcoll(consr char*str1,const char*str2) 比较str1和str2,比较规则由setlocale指定
/**char *setlocale(int type,const char * locale)
setlocale 试图利用locale指向的字符串,将字符串改成type指定的类型
type指定的类型有:
LC_ALL, 涉及定义类别
LC_COLLATE,影响strcoll的操作
LC_CTYPE,改变字符函数的工作方式
LC_MONETARY,确定货币格式
LC_NUMERIC,改变格式化输入输出数字的小数点
LC_TIME,确定strftime函数的行为**/
//char *strcpy(char *str1,const char *str2)如果数组重叠,拷贝结果不确定
//size_t strlen(const char *str)


//size_t strcspn(const char*str1,const char*str2)索引返回str1中第一次出现的 str2字符 的下标
//size_t strspn(consr char*str1,consr char *str2)索引返回str1中第一次出现的 非str2字符 的下标
//char* strerror(int errnum) 根据错误号,获取指向错误信息的字符串
int main()
{
size_t n = strcspn("hello world", "world");//n = 2
n = strcspn("asdf","ghjk");//n=4
n = strcspn(" "," kl");//n=0
const char *tmp = strpbrk("asdf","ghjk");
/* for(int i=0; i<43; i++)
{
printf("%s\n",strerror(i));
}*/
char str1[20] = "helloworldcome";
char *p = strncat(str1,"com",3);
printf("%s\n",str1);
char str2[20];
char *p1 = strncpy(str2,"hello",5);
const char *s2 = strstr("world hello nihao hello","ni");
// const char *s2 = strstr("world hello nihao hello","nihello");
printf("%s\n",p1);
char *s = strtok("hrll","fr");
return 0;
}
#endif
//char *strncat(char *str1,const char *str2,size_t count)连接str2的前count个字符到str1,并在末尾添上‘\0’
//不进行边界的检查,如果发生重叠后果未知。
//int strncmp(const char*str1,const char *str2,size_t count)
//char *strncpy(char *str1,const char*str2,size_t count)拷贝count个字符,如果不足count,将用‘\0‘填充。
//不进行边界检查,末尾不自动添‘\0‘,发生重叠后果未知

//char *strpbrk(const char*str1,const char *str2)匹配,返回str2任意字符在str1首次出现的地址
//char *strstr(const char*str1,const char*str2)返回str1 中第一次出现 str2子串的地址,字符串匹配

//int toupper(char ch)
//int tolower(char ch)

/*********************************************************************************
char* strtok(char *str1,const char *str2)
返回指向str1字符串中下一个标记(token)的指针

char string[] = "A string\tof ,,tokens\nand some more tokens";
char seps[] = " ,\t\n";
char *token;

int main( void )
{
printf( "Tokens:\n" );

// Establish string and get the first token:
token = strtok( string, seps ); // C4996
// Note: strtok is deprecated; consider using strtok_s instead
while( token != NULL )
{
// While there are tokens in "string"
printf( " %s\n", token );

// Get next token:
token = strtok( NULL, seps ); // C4996
}
}
打印结果:
A
strings
of
tokens
and
some
more
tokens
**********************************************************************************/

//size_t strxfrm(char *str1,const char *str2,size_t count)
//为通过strcmp比较字符串,将str2字符串转换格式,保存到str1中。结果使用str1 的strcmp
//和使用str2 的 strcoll结果相同。
//如果 区域选项 是 "POSIX" 或者 "C", 那么 strxfrm() 同用 strncpy() 来 拷贝 字符串 是等价的.
#include <cstring>
#include <iostream>
#include <windows.h>
int main(int argc, char* argv[])
{
char* source = "23234abc";
char des[100];
size_t len = strxfrm(des, source, 50);
std::cout << "len:" << len <<std::endl;
std::cout << "des:" << des <<std::endl;
return 0;
}

//Q6:如何使用strcoll 和 strxfrm ??

处理字符串的函数 (1)