字符函数和字符串函数大家好我是沐曦希
- 1.前言
- 2.长度受限制的字符串函数介绍
- 2.1 strncpy
- 2.1.1 模拟实现strncpy
- 2.2 strncat
- 2.2.1 模拟实现strncat
- 2.3 strncmp
- 2.3.1 模拟实现strncmp
- 3.字符串查找
- 3.1.strstr
- 模拟实现strstr
- 3.2.strtok
- 4.错误信息报告
- 4.1strerror
- 5.字符操作
- 5.1 字符分类函数
- 5.2 字符转换
- 6.写在最后
1.前言
前面学到了求字符串函数strlen和长度不受限制的字符串函数,那么现在学习学习另一些字符串函数。
2.长度受限制的字符串函数介绍 2.1 strncpychar * strncpy ( char * destination, const char * source, size_t num );
1.Copies the first num characters of source to destination. If the end of the source C string (which is signaled by a null-character) is found before num characters have been copied, destination is padded with zeros until a total of num characters have been written to it.
2.拷贝num个字符从源字符串到目标空间。
3.如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
#include#include int main() { char arr1[10] = "abcdef"; char arr2[4] = "ddd"; strncpy(arr1, arr2, 3); printf("%sn", arr1); return 0; }
调试看一下,为复制之前:
复制后:
arr1的前三个字节改变成arr2的内容,arr2没有变化。
如果要复制的字节数大于源字符串呢?
源字符串字节小于复制的字节数:
#include#include int main() { char arr1[10] = "abcdef"; char arr2[4] = "d"; strncpy(arr1, arr2, 5); printf("%sn", arr1); return 0; }
复制之前:
复制之后:
可以清楚的看到,内容不够时会用’ ’来补充!
#include2.2 strncat#include char* my_strncpy(char* dest, const char* src, size_t n) { assert(dest && src); char* ret = dest; while (n--) { *dest++ = *src++; } return ret; } int main() { char arr1[10] = "abcdef"; char arr2[6] = "ddddd"; my_strncpy(arr1, arr2, 5); printf("%sn", arr1); return 0; }
char * strncat ( char * destination, const char * source, size_t num );
1.Appends the first num characters of source to destination, plus a terminating null-character.
2.If the length of the C string in source is less than num, only the content up to the terminating null-character is copied.
#include#include int main() { char arr1[15] = "zhang aaaaa"; char arr2[] = "san"; strncat(arr1, arr2, 3); printf("%sn", arr1); return 0; }
追加之前:
追加之后:
可以清楚看到追加的字符串后面会加‘ ’作为结束标志,并且在目标字符串的’ ’位置开始追加的源字符串的。
那么如果追加的字节数大于源字符串的字节数呢?
#include#include int main() { char arr1[15] = "zhang aaaaa"; char arr2[] = "s"; strncat(arr1, arr2, 5); printf("%sn", arr1); return 0; }
追加之前:
追加之后:
可以清楚看见并没有继续追加’ ’,只会添加一个’ ’。
#include2.3 strncmp#include char* my_strncat(char* dest, const char* src, size_t n) { assert(dest && src); char* ret = dest; while (*dest != ' ') dest++; while (n--) { *dest++ = *src++; } *dest = ' '; return ret; } int main() { char arr1[15] = "zhang xxxx"; char arr2[4] = "san"; my_strncat(arr1, arr2, 3); printf("%sn", arr1); return 0; }
int strncmp ( const char * str1, const char * str2, size_t num );
1.比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。
#include#include 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 %sn", str[n]); } return 0; }
strncmp与strcmp一样比较的是字符的ASCII码值。
#include3.字符串查找 3.1.strstr#include int my_strncmp(const char* str1, const char* str2, size_t n) { assert(str1 && str2); while (n--) { if (*str1 != *str2) break; str1++; str2++; } return (*str1 - *str2); } int main() { char arr1[] = "abcdef"; char arr2[] = "abq"; int ret = my_strncmp(arr1, arr2, 3); printf("%dn", ret); if (ret > 0) printf("arr1>arr2"); else if (ret == 0) printf("arr1==arr2"); else printf("arr1); return 0; }
const char * strstr ( const char * str1, const char * str2 );
char * strstr ( char * str1, const char * str2 );
Returns a pointer to the first occurrence of str2 in str1, or a null pointer if str2 is not part of str1.
#include模拟实现strstr#include int main() { char str[] = "This is a simple string"; char* pch = NULL; pch = strstr(str, "simple"); puts(pch); return 0; }
查找字符串分两种情况:
第一种情况是:一次匹配完成。
第二种情况是:要多次匹配才能找到。
#include3.2.strtok#include char* my_strstr(const char* str1, const char* str2) { assert(str1 && str2); const char* p = str1; const char* s2 = str2; const char* s1 = str1; while (*p) { s1 = p; s2 = str2; while (*s2 == *s1 && *s1 != ' ' && s2 != ' ') { s2++; s1++; } if (*s2 == ' ') return (char*)p; p++; } return NULL; } int main() { char arr1[] = "bbbcdef"; char arr2[] = "bbc"; char* ret = my_strstr(arr1, arr2); if (ret == NULL) printf("字符串不存在!n"); else printf("%sn", ret); return 0; }
char * strtok ( char * str, const char * delimiters );
1.sep参数是个字符串,定义了用作分隔符的字符集合
2.第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
3.strtok函数找到str中的下一个标记,并将其用 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
4.strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
5.strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
6.如果字符串中不存在更多的标记,则返回 NULL 指针。
#include#include int main() { const char* seq = "@."; char email[] = "LiuJin@qq.com"; char cp[30] = { 0 }; strcpy(cp, email); char* ret = strtok(cp, seq); if (ret != NULL) printf("%sn", ret); ret = strtok(NULL, seq); if (ret != NULL) printf("%sn", ret); ret = strtok(NULL, seq); if (ret != NULL) printf("%sn", ret); return 0; }
for循环实现
#include4.错误信息报告 4.1strerror#include int main() { const char* seq = "@."; char email[] = "LiuJin@qq.com"; char cp[30] = { 0 }; strcpy(cp, email); char* ret = NULL; for (ret = strtok(cp, seq); ret != NULL; ret = strtok(NULL, seq)) { printf("%sn", ret); } return 0; }
char * strerror ( int errnum )
C语言的库函数在执行失败的时候,都会设置错误码。
errno是C语言设置的一个全局的错误码存放的变量。
#include#include #include //必须包含的头文件 int main() { FILE* pFile; pFile = fopen("unexist.ent", "r");//fopen打开文件 //r-->read,表示文件以读形式打开 if (pFile == NULL) printf("Error opening file unexist.ent: %sn", strerror(errno)); //errno: Last error number return 0; }
#include5.字符操作 5.1 字符分类函数#include int main() { printf("%sn", strerror(0)); printf("%sn", strerror(1)); printf("%sn", strerror(2)); printf("%sn", strerror(3)); printf("%sn", strerror(4)); printf("%sn", strerror(5)); return 0; }
| 函数 | 如果他的参数符合下列条件就返回真 |
|---|---|
| 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 | 任何可打印字符,包括图形字符和空白字符 |
int tolower ( int c ); int toupper ( int c );
#include6.写在最后#include int main() { int i = 0; char str[] = "Test String.n"; char c; while (str[i]) { c = str[i]; if (isupper(c)) c = tolower(c); putchar(c); i++; } return 0; }
那么这一次的字符函数和字符串函数的笔记就到这里啦。小沐会持续更新字符函数和字符串函数。
不去努力争取,那你连失败的资格都没有!
暑期编程PK赛 得CSDN机械键盘等精美礼品!


