坑爹的不受限字符串函数
来源:互联网 发布:java 毫秒和秒的换算 编辑:程序博客网 时间:2024/06/06 11:47
1、字符串长度函数原型:
size_t strlen(char const *string);
strlen()计算的长度不包括'\0'。
strlen返回的值是一个无符号的整型,所以像if(strlen(x)-strlen(y)>=0)的结果是绝对为真的,将达不到你想要的结果。
计算字符串长度的实现:
#include<stdio.h>#include<stdlib.h>int my_strlen(char *p){ int count = 0; while(*p != '\0') { count++; p++; } return count;}int main(){ char arr[100]; scanf( "%s", arr); int ret = my_strlen(arr); printf( "%d\n", ret); system( "pause"); return 0;}
2、字符串复制函数原型:
char *strcpy(char *dst,char const *src);
strcpy()函数是将参数src字符串中的字符复制到参数dst中,当参数dst和参数src内存出现重叠时,其结果是未定义的。
注意:
1、strcpy()遇见'\0'才停下,所以当参数src字符串长度大于参数dst字符串时,多余的字符会将参数dst字符串后面的内存空间覆盖掉,这时非常危险的。
2、当src中字符串比dst中的短时,由于strcpy()会将src中的'\0',复制过去,所以新字符串后面的老字符串会被删除掉。
char arr[]="hello world";
strcpy(arr,welcome);
welcome0rl
d0
如表,新字符串遇见'\0'停下,后面的字符就相当于被删除了。
字符串复制“功能”的实现:
#include<stdio.h>#include<stdlib.h>void my_strcpy(char *p1, char *p2){ while (*p2 != '\0') { * p1 = *p2 ; p1++; p2++; } * p1 = '\0' ;}int main(){ char arr1[100]; char arr2[50]; scanf( "%s", arr1); scanf( "%s", arr2); my_strcpy(arr1, arr2); printf( "%s\n", arr1); system( "pause"); return 0;}
3、字符串连接函数原型:
char *strcat(char *dst,char *src);
strcat()函数是将src中的字符串连接在dst中的字符串后面,如果src与dst位置发生重叠,其结果也是未定义的。
注意:在使用strcat()函数时,必须要考虑dst数组中除过原字符串之后剩下的空间能否容纳下src。
字符串连接“功能”的实现:
#include<stdio.h>#include<stdlib.h>void my_strcat(char *p1, char *p2){ while (*p1 ) { p1++; } while (*p2 ) { * p1 = *p2 ; p1++; p2++; } * p1 = '\0' ;}int main(){ char arr1[100]; char arr2[50]; scanf( "%s%s", arr1, arr2); my_strcat(arr1, arr2); printf( "%s\n", arr1); system( "pause"); return 0;}
4、字符串比较函数原型:
int strcmp(char const *s1,char const *s2);
字符串比较的是ASCII的值,对两个字符串中的字符逐个比较,发现第一个不匹配的字符,如果s1中的ASCII大于s2中的,则返回一个大于零的数,如果小于,则返回一个小于零的数。如果s1中字符串比s2中短,则返回一个小于零的数。
如果一直匹配,直到‘\0’,两个字符串就相等,则返回0。
字符串比较“功能”的实现:
#include<stdio.h>#include<stdlib.h>int my_strcmp(char *p1, char *p2){ if (*p1 == *p2) { while (*p1 == *p2) { if (*p2 == '\0') return 0; p1++; p2++; } if (*p1 > *p2) return 1; else return -1; }}int main(){ char arr1[100]; char arr2[100]; scanf( "%s%s", arr1, arr2); int ret = my_strcmp(arr1,arr2); printf( "%d\n", ret); system( "pause"); return 0;}
5、查找一个字符函数原型:
char *strchr(char const *str,int ch);
char *strrchr(char const *str,int ch);
strchr()是查找第一次出现的位置,strrchr()是查找最后一次出现的位置。如果找到就返回一个指向这个位置的指针,如果没找到就返回NULL。
查找一个字符第一次出现“功能”的实现:
#include<stdio.h>#include<stdlib.h>char *my_strchr(char *p, char chr){ while (*p ) { if (*p == chr) return p ; p++; } return NULL ;}int main(){ char arr[100]; char chr; printf( "输入被查找使我字符\n" ); scanf( "%c", &chr); printf( "输入查找的字符串\n" ); scanf( "%s",arr); char *ret=my_strchr(arr, chr); printf( "%s\n", ret); system( "pause"); return 0;}
“查找一个字符最后一次出现”功能的实现:
#include<stdio.h>#include<stdlib.h>char *my_strrchr(char *p, char chr){ char *p2 = NULL ; while (*p ) { if (*p == chr) p2 = p; p++; } return p2;}int main(){ char arr[100]; char chr; printf( "输入被查找的字符\n" ); scanf( "%c", &chr); printf( "输入查找的字符串\n" ); scanf( "%s", arr); char *ret = my_strrchr(arr, chr); printf( "%s\n", ret); system( "pause"); return 0;}
6、查找一个字符串是否是另一个字符串的子串原型:
char *strstr(char const *s1,char const *s2);
这个函数在s1中查找整个s2在s1第一次出现的位置,如果找到 则返回这个地址,如果没有找到,则返回NULL,如果s2为空字符串,则返回s1。
查找一个字串“功能”的实现:
#include<stdio.h>#include<stdlib.h>char *my_strstr(char *p1, char *p2){ if (*p2 == NULL) return p1 ; while (*p1 ) { if (*p1 == *p2) { char *p3 = p1 ; char *p4 = p2 ; while (*p3 == *p4) { if (*p4 == '\0' ) return p1 ; p3++; p4++; } if (*p4 == '\0' ) return p1 ; } p1++; } return NULL ;}int main(){ char arr1[100]; char arr2[100]; scanf( "%s%s", arr1, arr2); int ret = my_strstr(arr1, arr2); printf( "%d\n", ret); system( "pause"); return 0;}
- 坑爹的不受限字符串函数
- 长度受限的字符串函数的实现
- 模拟输出受限制的字符串函数-strncat,strncmp,strncpy
- 模拟实现长度受限制的字符串函数(strncpy、strncat、strncmp)
- 函数访问参数受限的处理方法
- Python: 受限制的 "函数调用"
- 不使用strlen函数求字符串的长度的方法
- “受限用户”的解决方法
- 受限的玻尔兹曼机
- 受限的玻尔兹曼机
- 受限的玻尔兹曼机
- 三个不常用的c语言字符串函数
- C#不区分大小写的字符串替换(Replace)函数
- 不使用strcmp函数比较两个字符串的大小
- 不常用字符串函数记录
- 在不受限内存情况猜数字次数最小的算法
- ZOJ1586 恩 最小生成树 也不知道怎么 自己的 时间受限 后来终于搞对了 也知道时间受限为什么了 你不停止 当然时间受限啊!!
- 编写程序删除一个字符串(不能使用任何操纵字符串的函数,不使用下标)
- 改变运算顺序的运算符
- druid 应用到项目中
- Oracle字符,数值等操作
- Python运行报错IndentationError: unindent does not match any outer indentation level
- Concurrent包中Queue(1)----LinkedBlockingQueue
- 坑爹的不受限字符串函数
- C++数据类型
- Activity传递对象的方法《转载》
- 数组名与数组名取地址的差异
- In-memory Computing with SAP HANA读书笔记 - 第三章:Software components and data replication methods
- android 慎用drawable中大图,造成内存溢出的解决方案
- EventBus使用详解(一)——初步使用EventBus
- [swift学习之九]异常处理
- mac Homebrew