C语言: 字符串 -2
一 C 语言字符处理函数库 ctype.h
字符处理函数库(Character-handling library),包含几个用于字符数据测试和操作的函数。每个函数接受的实参都是一个用整型数或EOF表示的字符。在 C 语言中 字符通常被当作整型数来处理,因为C语言中的字符通常是一个字节的整数。一般而言, EOF的值为 -1,但是某些硬件体系结构不允许在char类型变量中存储负值,所以,字符处理函数把这种字符当作整型数来处理。
函数原型 | 描述 |
int isdight(int c) | 如果C是数字,函数返回真,否则,返回假(0) |
int isalpha(int c) | 如果C是字母,函数返回真,否则,返回假(0) |
int isalnum(int c) | 如果C是数字或字母,函数返回真,否则,返回假(0) |
int isxdigit(int c) | 如果C是一个十六进制的数字字符,函数返回真,否则,返回假(0) |
int islower(int c) | 如果C是小写字母,函数返回真,否则,返回假(0) |
int isupper(int c) | 如果C是大写字母,函数返回真,否则,返回假(0) |
int tolower(int c) | 如果C是大写字母,函数将 C 转换为小写字母后返回,否则,返回未改变实参 C 的值 |
int toupper(int c) | 如果C是小写字母,函数将 C 转换为大写字母后返回,否则,返回未改变实参 C 的值 |
int isspace(int c) | 如果c 是空白字符( '\n' ; ' ' ; '\f' ; '\r' ; '\t' ; '\v' ),则函数返回为真,否则,返回假(0) |
int iscntrl(int c) | 如果 c 是一个控制符,则函数返回为真,否则,返回假(0) |
int ispunct(int c) | 如果 c 是一个除空格,数字,字母以外的所有可打印字符,则函数返回为真,否则,返回假(0) |
int isprint(int c) | 如果 c 是一个包含空格在内的可打印字符,则函数返回为真,否则,返回假(0) |
int isgraph(int c) | 如果 c 是一个除空格以外的所有可打印字符,则函数返回为真,否则,返回假(0) |
示例:
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h> //字符函数头文件void main()
{char n = '10';//int n = '8';int flag = isdigit(n);//isdigit 判断字符是否是数字printf("根据 isdigit 函数判断是否是数字\n ");if (flag){printf("n='10'-> n是数字\n");}else{printf("n='10'-> n是不数字\n");}printf("\n----------------------\n");char c1 = 'B';printf("根据 isalpha 函数判断是否是字母\n ");char* str1 = { isalpha(c1) ? "c1='B' c1是字母" : "c1='B' c1不是字母" };printf("%s \n", str1);printf("\n----------------------\n");printf("%s\n%s%s\n%s%s\n%s%s\n%s%s\n","According to isalnum:",isalnum('A') ? "A is a" : "A is not a", "letter",isalnum('b') ? "b is a" : "b is not a", "letter",isalnum('#') ? "# is a" : "# is not a", "letter",isalnum('4') ? "4 is a" : "4 is not a", "letter");printf("\n----------------------\n");printf("%s\n%s%s\n%s%s\n%s%s\n%s%s\n","根据 isxdigit 函数判断是否是十六进制字符:",isxdigit('A') ? "A 是一个" : "A 不是一个", "十六进制字符",isxdigit('K') ? "K 是一个" : "K 不是一个", "十六进制字符",isxdigit('E') ? "E 是一个" : "E 不是一个", "十六进制字符",isxdigit('G') ? "G 是一个" : "G 不是一个", "十六进制字符");printf("\n----------------------\n");printf("%s\n%s%s\n%s%s\n","根据 islower 函数判断字符是否是小写字符:",islower('A') ? "A 是一个" : "A 不是一个", "小写字符",islower('a') ? "a 是一个" : "a 不是一个", "小写字符");printf("\n----------------------\n");printf("%s\n%s%s\n%s%s\n","根据 isupper 函数判断字符是否是大写字符:",isupper('A') ? "A 是一个" : "A 不是一个", "大写字符",isupper('a') ? "a 是一个" : "a 不是一个", "大写字符");printf("\n----------------------\n");system("pause");
}
二 通用函数库中字符串转换函数 stdlib.h:
这些函数将数字字符串转换为整数或浮点型数值。注意:使用限定符 const 声明函数头中的变量 nPtr (从右向左读,nPtr 是一个指针,指向一个字符常量),const 规定这个实参的值不能被修改。
函数原型 | 函数描述 |
double atof(const char *nPtr) | 将 nPtr 指向的字符串转换为双精度浮点数 |
int atoi(const char *nPtr) | 将 nPtr 指向的字符串转换为整型数 |
long atol(const char *nPtr) | 将 nPtr 指向的字符串转换为长整型数 |
double strtod(const char *nPtr, char **endPtr) | 将 nPtr 指向的字符串转换为双精度浮点数 |
long strtol(const char *nPtr, char **endPtr, int base) | 将 nPtr 指向的字符串转换为长整型数 |
unsigned long strtoul(const char *nPtr, char **endPtr, int base) | 将 nPtr 指向的字符串转换为无符号长整型数 |
示例:
#include<stdio.h>
#include<stdlib.h>void main()
{double d1 = atof("12.3345");printf("%s %.4f\n", "字符串:‘12.3345’, 转换为双精度浮点类型为:", d1);printf("\n --------------------- \n");int n1 = atoi("100");printf("%s %d\n", "字符串:‘100’, 转换为整数类型为:", n1);printf("\n --------------------- \n");long l1 = atol("1000000000");printf("%s %d\n%s %d\n", "字符串:‘1000000000’, 转换为长整数类型为:", l1,"它的2分之一为:",l1/2);printf("\n --------------------- \n");const char* str1 = "52.12% abc";double d2;char* strPtr1;d2 = strtod(str1, &strPtr1);printf("转换为:%.zf \n剩余字符串为:%s\n", d2, strPtr1);printf("\n --------------------- \n");const char* str2 = "-12399334abc";char* strPtr2;long l2;l2 = strtol(str2, &strPtr2, 0);//参数1 字符串,参数2 剩余字符串,参数3 转换后数值可以表示的进制形式(8进制,基数为8;10进制 基数为10 ;16进制 基数为16)这个基数可以指定 0 或2 - 36 之间的任意数printf("转换为:%ld \n剩余字符串为:%s\n", l2, strPtr2);printf("再加上 %d 后的结构是:%ld \n", 550, l2 + 550);printf("\n --------------------- \n");const char* str3 = "123456789NNN";char* strPtr3;long l3;l3 = strtol(str3, &strPtr3, 0);printf("转换为:%lu \n剩余字符串为:%s\n", l3, strPtr3);printf("再减去 %d 后的结构是:%lu \n", 550, l3 + 550);printf("\n --------------------- \n");system("pause");
}
三 字符串处理函数库 string.h
字符串复制和连接函数:
函数原型 | 函数描述 |
char * strcpy ( char *s1 , const char * s2) | 将字符串s2 复制到s1 中,函数返回s1的值 |
char * strncpy ( char *s1 , const char * s2, size_t n) | 把 s2指向的字符串的 n 个 字符,拷贝到 s1 指向的位置,函数返回 s1 |
char * strcat ( char *s1 , const char * s2) | 把 s2 指向的字符串拷贝到 s1指向字符串的后面,s2 字符串的第一个字符位置覆盖 s1字符串的空字符位置,函数返回 s1 |
char * strncat ( char *s1 , const char * s2, size_t n) | 把 s2 指向的字符串的 n 个字符拷贝到 s1指向字符串的后面(或拷贝到s2的空字符为止),s2 字符串的第一个字符位置覆盖 s1字符串的空字符位置,函数返回 s1 |
示例:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>/*获取字符串个数
*/
int countString(char* str)
{int n = 0;while (*str!='\0'){n++;str++;}return n;
}int main()
{printf("******************** 字符串拷贝函数示例 ********************\n\n");char* str = "Happy Birthday to you";char str1[50] = {0};char str2[50] = {0};printf("%s%s\n%s%s\n", "原字符串str:", str, "拷贝后str1:", strcpy(str1, str));int num = countString(str);strncpy(str2, str, num - 7);//如果字符数组没有初始化为0 ,保险期间应加上 :str2[num-7]='\0' ,添加字符串结束标记printf("%s%s\n", "拷贝后str2:", str2);printf("******************** 字符串拷贝函数示例 ********************\n\n");printf("******************** 字符串连接函数示例 ********************\n\n");char s1[20] = "Happy ";char s2[] = "New Year";char s3[50] = { 0 };printf("s1=%s\ns2=%s\ns3=%s\n", s1, s2, s3);printf("strcat(s1,s2)=%s\n", strcat(s1, s2));printf("strcat(s3,s1,6)=%s\n", strncat(s3, s1,6));printf("strcat(s3,s1)=%s\n", strcat(s3, s1));printf("******************** 字符串连接函数示例 ********************\n\n");system("pause");
}
字符串比较函数:
函数原型 | 函数描述 |
int strcmp( const char *s1 , const char *s2) | 比较字符串s1和 s2,当 s1 等于,小于,大于s2时,函数分别返回 0,1,-1 |
int strncmp( const char *s1 , const char *s2, size_t n) | 比较字符串s1和s2的n个字符,当 s1 等于,小于,大于s2时,函数分别返回 0,1,-1 |
示例:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>/*自定义字符串比较函数 ,返回 int 类型 0 相等 ,!0 不等
*/
int myStrcmp(char *p1, char *p2)
{int i = 0; //下标,从第一个字符开始比较//如果相当且没有结束,就一直向前比较while (p1[i]==p2[i]&&p1[i]!='\0'){i++;//下标向前移动}int num;if (p1[i] == '\0'&&p2[i] == '\0'){num = 0;}else{num = p1[i] - p2[i]; //将差值赋值num}return num;
}void main()
{//strncmp :比较字符串前 n 个字符是否相等 ,其他与strcmp相同char chA[30] = "notepadAAA";char chB[30] = "notepadSS";if (strncmp(chA, chB, 7) == 0){printf("%s 和 %s 的前 %d 个字符比较结果是:相等\n", chA, chB,7);}else{printf("%s 和 %s 的前 %d 个字符比较结构是:不等\n", chA, chB, 7);}//strcmp函数: 返回int类型 相当 =0 大于 =1 小于 =-1 一般用于验证密码char ch1[20] = "Strcmp";char ch2[20]= "strcmp";// int num = strcmp(ch1,ch2);_strupr(ch1); //转大写_strupr(ch2);int num = myStrcmp(ch1, ch2);if (num == 0) {printf("%s 和 %s 的比较结果是:相等\n",ch1,ch2);}else{printf("%s 和 %s 的比较结果是:不等\n", ch1, ch2);}system("pause");
}
字符串查找函数:
函数原型 | 函数描述 |
char *strchr ( const char *s , int c) | 在 S 所指向的对象中,确定字符C第一次出现的位置。若找到C,函数返回 S 中 C 的指针,否则返回NULL |
size_t strcspn( const char *s1, const char *s2 ) | 确定并返回字符串s1中不包含(未出现)在字符串s2中任何字符的(最大)起始(字符串片段的)长度 |
size_t strspn( const char *s1, const char *s2 ) | 确定并返回字符串s1中只包含字符串s2中字符的起始字符串片段的长度 |
char * strbrk( const char *s1, const char *s2 ) | 在字符串s1中,确定字符串s2中字符第一次出现的位置。若找到字符串s2中的字符,函数则返回指向s1中该字符的指针。否则返回NULL指针 |
char *strrchr ( const char *s , int c) | 在 S 所指向的对象中,确定字符C 最后一次出现的位置。若找到了C 函数返回S 中 C 的指针,否则返回NULL 指针 |
char * strstr( const char *s1, const char *s2 ) | 在字符串 s2 中,确定字符串s1 第一次出现的位置。若找到了字符串,函数返回s1中的指针,否则返回NULL指针 |
char * strtok( const char *s1, const char *s2 ) | 连续调用 strtok 函数将字符串s1 分解成若干“标号” (Token)。------ 一行文本中的逻辑片段,例如单词。这些逻辑片段是被字符串s2中的字符所分割的。第一次调用 strtok 函数需要包含 s1作为第一个实参。如果后续的 strtok 函数调用任然对同一个字符串标号化,则必须以 NULL 作为第一个实参。每次函数调用都指向当前标号的指针,当函数不在产生新的 标号时,返回NULL |
示例1:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>void show1(char* p, int len);
int indexes(char* p1, char* p2);int main(void)
{const char* str = "I Love My Motherland China";char ch1 = 'M';char* pch1 = NULL;printf("------------字符查找函数 strchr -----------------\n\n");pch1 = strchr(str, ch1);if (pch1 == NULL){printf("%c ,没有在字符串“ %s ” 中出现\n",ch1,str);}else{printf("[%c] ,在字符串“ %s ” 中出现\n", ch1, str);printf("[%c] ,的指针地址是:%p, 存储的字符是:%c\n", ch1, pch1,*pch1);}printf("\n------------------------------------------------\n\n");///printf("------------字符查找函数 strcspn -----------------\n\n");const char* str1 = "The value is 3.1415926 and so on ...... ......";char* pstring1 = "1234567890";unsigned int length1 = strcspn(str1, pstring1);//返回的只能是从字符串起始位置开始printf("字符串“ %s ” 中 没有包含字符串 “ %s ” 的最大片段长度是:%d\n",str1, pstring1,length1);printf("字符串:");show1(str1, length1);printf("长度是:%u",length1);printf("\n------------------------------------------------\n\n");//printf("------------字符查找函数 strpbrk -----------------\n\n");const char* str2 = "This is a Test";const char* str3 = "apple";char* pch2 = strpbrk(str2, str3);printf("字符串 [%s] ,中的字符 在字符串 [%s] 中第一个匹配的是:%c \n", str3, str2, *pch2);int n = indexes(str2, pch2);if (n > 0){printf("字符 【%c】在 【%s】中的位置是:%d \n",*pch2,str2, n);}printf("\n------------------------------------------------\n\n");///printf("------------字符查找函数 strrchr -----------------\n\n");char ch2 = 'n';char* pch3 = strrchr(str, ch2);if (pch3 != NULL){printf("字符【%c】在字符串【%s】最后出现的位置是【%s】", ch2,str, pch3);}printf("\n------------------------------------------------\n\n");//return 0;system("pause");
}//输出字符串从开始到指定长度
void show1(const char* p, int len)
{if (len == 0||p==NULL){return;}int n = 0;while (n<len){printf("[%c] ", *p);p++;n++;}}//求字符 在字符串中的索引位置
int indexes(char* p1, char* p2)
{int n = -1;if (p1 == NULL || p2 == NULL){return n;}while (*p1!='\0'){n++;if (*p1 == *p2){return n;}p1++;}return n;
}
示例2:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>int main(void)
{printf("------------字符查找函数 strchr -----------------\n\n");const char* str1 = "The value is 3.1415926,3.1415927";char* pstring1 = " ehT iseluav";unsigned int n = strspn(str1, pstring1);printf("str1 中包含 pstring1 的最大字符串片段长度是: %d \n", n);printf("\n------------------------------------------------\n\n");///printf("------------字符查找函数 strstr -----------------\n\n");char* str2 = "3.14";char* pstring2 = strstr(str1, str2);if (pstring2 != NULL){printf("%s 在 %s \n 第一次出现的位置是: %s\n",str2, str1, pstring2);}printf("\n------------------------------------------------\n\n");///printf("------------字符串分割函数 strtok -----------------\n\n");char str3[100] = "This is sentence with 7 tokens";char* tokenPrt; //声明创建一个指针printf("%s 使用空格分割为以下字符串:\n", str3);tokenPrt = strtok(str3, " ");//使用空格分割 (开始)while(tokenPrt != NULL){printf("%s\n", tokenPrt);tokenPrt = strtok(NULL, " "); //继续使用空格分割字符串 ,继续分割同一个字符串,第一参数为 NULL}printf("\n------------------------------------------------\n\n");system("pause");
}
字符串处理库中内存函数:
函数原型 | 函数描述 |
void *memcpy(void *s1,const void *s2,size_t n); | 将 s2 中的n个字符复制到s1中,返回指向目标对象(s1)的指针,如果两个位置出现重叠,其行为未定义。 |
void *memmove(void *s1,const void *s2,size_t n); | 从s2 中复制n个字符到s1中,其行为与拷贝类似,返回指向目标对象(s1)的指针。但是出现局部重叠情况,该函数会先把重叠的内容拷贝至临时变量。 |
void *memcmp(void *s1,const void *s2,size_t n); | 比较s1所指向前n个字符和s2所指向的前n个字符,每个值解释未 char 类型,如果 n 个字符都匹配,则完全相同,函数返回 0 ,如果s1 小于 s2 函数返回值 <0 , 反之 >0 |
void *memchr(const void *s, int c ,size_t n); | 在 s 所指向的前 n 个字符中,确定 c 第一次出现的位置。若找到 c 返回指向 c 的指针,否则返回NULL |
void *memset void *s, int c ,size_t n); | 将 C (无符号 char)复制到 s 所指向前 n 个字符中,返回指向目标对象(s)的指针 |
示例:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>int main(void)
{char s1[30] = { 0 };char s2[30] = "Copy this string";unsigned int len1 = sizeof("Copy this string");printf("s1=%s ;s2=%s\n", s1, s2);printf("拷贝后 s1=%s\n", (char *)memcpy(s1, s2,len1));//如果 s1 没有初始化为0 长度=len1+1(包含结束标志)printf("\n------------------------------------------------\n\n");char s3[] = "Home Sweet Home";char s4[] = "I Love My Motherland China";printf("复制之前:%s\n", s3);printf("复制之后:%s\n", (char*) memmove(s3, &s3[5], 10));//复制到s3 从开始位置起,到指定长度结束,覆盖原有的字符printf("复制之前:%s\n", s4);printf("复制之后:%s\n", (char*) memmove(s4, &s3[5], 10));//复制到s4 从开始位置起,到指定长度结束,覆盖原有的字符printf("\n------------------------------------------------\n\n");char str1[] = "ABCDEFG";char str2[] = "ABCDXYZ";printf("比较两个字符串的前 n 个字符:\n str1=%s\nstr2=%s\n", str1, str2);printf("memcmp(str1,str2,4)=%2d\nmemcmp(str1,str2,7)=%2d\nmemcmp(str2,str1,7)=%2d\n", memcmp(str1, str2, 4), memcmp(str1, str2, 7),memcmp(str2, str1, 7));//字符排序越靠后,越大printf("\n------------------------------------------------\n\n");char str3[] = "This is a string";char ch = 's';unsigned int count = sizeof("This is a string");char* p =(char *) memchr(str3, ch, count);if (p != NULL){printf("%c 在 %s 中找到,地址=%p \n", ch, str3,p);}printf("\n------------------------------------------------\n\n");char str[30] = "AAAAAAAAAAAAAAAAAAAA";//这里不能用字符串指针,数组可以改变元素的值,而字符串指针不可以printf("原字符串 str=%s\n", str);printf("复制后 str=%s\n", (char *)memset(str, 'a', 10));system("pause");
}
其他函数:
函数原型 | 函数描述 |
char *strerror( int errornum) | 将错误号 errornum 以地址方式映射成(信息可能因为地址不同而以不同的语言出现)一个纯文本字符串,返回指向这个字符串的指针 |
size_t strlen ( const char *s) | 获取 字符串 s 的长度,返回字符串 结束符号 NULL(‘ \0 ‘)前面的字符个数。 |
示例:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>void main()
{//遍历错误信息for (int i = 0; i < 10; i++){printf("%d : %s\n", i, strerror(i));}printf("\n------------------------------------------------\n\n");char* str1 = "AAAAAAAAAA";char str2[] = "This is a string";char str3[10] = "string";printf("%s\"%s\"%s%u\n%s\"%s\"%s%u\n%s\"%s\"%s%u\n","The lenght of",str1," is ",(unsigned int )strlen(str1),"The lenght of", str2, " is ", (unsigned int)strlen(str2),"The lenght of", str3, " is ", (unsigned int)strlen(str3));system("pause");
}
C语言: 字符串 -2相关推荐
- C语言字符串处理的库函数
使用C语言字符串处理的库函数,务必包含头文件string.h,即#include <string.h> 1. 比较字符串大小函数 1) 忽略大小写---strca ...
- c语言作业 字符串替换,C语言字符串替换。解决方法
当前位置:我的异常网» C语言 » C语言字符串替换.解决方法 C语言字符串替换.解决方法 www.myexceptions.net 网友分享于:2015-04-14 浏览:0次 C语言字符串替换 ...
- 字符串基本操作 c语言,数据结构C语言字符串的基本操作.doc
数据结构C语言字符串的基本操作 串的基本操作 #include #include #include #define m 100 typedef struct{ char ch[m]; int leng ...
- c语言字符串文库总结,C语言字符串.ppt
C语言字符串.ppt ACM程序设计,福州大学至诚学院 冯新,第四讲,字符串处理,常用函数介绍,复制,char* strcpy char *s1, const char *s2; 将字符串s2复制到s ...
- c语言中的字符串总是以,C语言字符串的结束标志是什么?
多级反馈队列调度算法详解 通常在使用多级队列调度算法时,进程进入系统时被永久地分配到某个队列.例如,如果前台和后台进程分别具有单独队列,那么进程并不从一个队列移到另一个队列,这是因为进程不会改变前台或 ...
- C语言字符串中最后一个单词的长度的算法(附完整源码)
C语言字符串中最后一个单词的长度的算法 C语言字符串中最后一个单词的长度的算法完整源码(定义,实现,main函数测试) C语言字符串中最后一个单词的长度的算法完整源码(定义,实现,main函数测试) ...
- C语言字符串是否为pallindrome排列的算法(附完整源码)
C语言字符串是否为pallindrome排列的算法 C语言字符串是否为pallindrome排列的算法完整源码(定义,实现,main函数测试) C语言字符串是否为pallindrome排列的算法完整源 ...
- C语言字符串中删除重复的字符的算法(附完整源码)
C语言字符串中删除重复的字符的算法 C语言字符串中删除重复的字符的算法完整源码(定义,实现,main函数测试) C语言字符串中删除重复的字符的算法完整源码(定义,实现,main函数测试) #inclu ...
- C语言字符串转换为整数(附完整源码)
C语言字符串转换为整数 C语言字符串转换为整数完整源码 C语言字符串转换为整数完整源码 #include <assert.h> #include <stdio.h> #incl ...
- C语言字符串相关一级指针内存模型
C语言字符串相关一级指针内存模型 通过实例探索一级指针内存模型 通过实例探索一级指针内存模型 void main() {char buf[20]= "aaaa";char buf2 ...
最新文章
- 能量平衡_500kA 铝电解槽的能量平衡分析
- xml解析 只有节点属性 android,and android:解析xml,一个节点标签中,有多个属性,怎样解析?...
- Linux如何在系统启动时自动加载模块
- IOS开发如何在iTunes中查看沙河下的路径
- 美国正面临“人才泡沫”破裂危机?
- 拥抱.NET Core,跨平台的轻量级RPC:Rabbit.Rpc
- 心中一万只草泥马在奔腾是种怎样的体验?| 今日最佳
- 飞畅科技-国内老牌工业以太网交换机品牌
- ubuntu opencv多版本控制
- mac phpstorm配置svn
- 亚马逊SP-API市场端点接口文档整理
- 墨修尧哪一章痊愈_墨修尧叶璃
- IEEE Fellow、AAAS Fellow 同日公布,清华唐杰、京东郑宇等数十位华人入选
- stm32—火焰传感器的初步使用
- 初学莫队算法 bzoj2038 小z的袜子 分块算法
- 学校计算机教室解说词词,小学各专用教室解说词.doc
- Html怎么判断ie5,css怎样判断IE浏览器?
- 数据库的备份恢复和SQL语句
- 联想Miix 5 Pro二合一笔记本如何装win7系统?
- STM32实战总结:HAL之GUI