网站制作的差异化定位,wordpress 优质插件,沧州地区做网站,东莞外贸公司建网站文章目录 一、求字符串长度strlen例子模拟实现 二、长度不受限制的字符串函数strcpy例子模拟实现 strcat例子模拟实现 strcmp例子模拟实现 三、长度受限制的字符串函数strncpy例子 strncat例子 strncmp例子 四、字符串查找strstr例子模拟实现 strtok例子 五、错误信息报告strer… 文章目录 一、求字符串长度strlen例子模拟实现 二、长度不受限制的字符串函数strcpy例子模拟实现 strcat例子模拟实现 strcmp例子模拟实现 三、长度受限制的字符串函数strncpy例子 strncat例子 strncmp例子 四、字符串查找strstr例子模拟实现 strtok例子 五、错误信息报告strerror例子 六、字符分类函数七、内存操作函数memcpy例子模拟实现 memmove例子模拟实现 memcmp例子 一、求字符串长度
strlen 功能获取字符串长度参数c字符串str返回值字符串长度无符号整形size_t字符串将 ‘\0’ 作为结束标志strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数不包含 ‘\0’ )。
例子
#include stdio.h
#include string.h
int main()
{const char* str1 abcdef;const char* str2 bbb;printf(%d\n, strlen(str1));printf(%d\n, strlen(str2));if (strlen(str2) - strlen(str1) 0){printf(str2str1\n);}else{printf(srt1str2\n);}return 0;
}模拟实现
计数器方式
int my_strlen(char* str)
{int len 0;while (*str){str;len;}return len;
}不创建临时变量
int my_strlen(const char* str)
{if (*str \0)return 0;elsereturn 1 my_strlen(str 1);
}指针-指针
int my_strlen(char* s)
{char* p s;while (*p!\0){p;}return p - s;
}二、长度不受限制的字符串函数
strcpy 功能复制字符串参数目的字符串destination源字符串source返回值目的字符串源字符串必须以 ‘\0’ 结束会将源字符串中的 ‘\0’ 拷贝到目标空间目标空间必须足够大以确保能存放源字符串目标空间必须可变
例子
#include stdio.h
#include string.hint main()
{char str1[] Sample string;char str2[40];char str3[40];strcpy(str2, str1);strcpy(str3, copy successful);printf(str1: %s\nstr2: %s\nstr3: %s\n, str1, str2, str3);return 0;
}模拟实现
char* my_strcpy(char* dest, const char* src)
{char* ret dest;//assert需要加入头文件assert.hassert(src ! NULL);assert(dest ! NULL);while (*dest*src){}return ret;
}strcat 功能连接字符串参数目的字符串destination源字符串source返回值目的字符串将源字符串的副本追加到目标字符串。目标中的终止空字符被源的第一个字符覆盖并且在目标中由两者串联形成的新字符串的末尾包含一个空字符。目的地和来源不得重叠。
例子
#include stdio.h
#include string.hint main ()
{char str[80];strcpy (str,these );strcat (str,strings );strcat (str,are );strcat (str,concatenated.);puts (str);return 0;
}模拟实现
char* my_strcat(char* dest, const char* src)
{char* ret dest;//assert需要加入头文件assert.hassert(dest);assert(src);while (*dest){dest;}while (*dest *src){}return ret;
}strcmp 功能比较两个字符串参数要比较的字符串1str1要比较的字符串2str2返回值
返回值表明0第一个不匹配的字符在 PTR1 中的值低于 PTR2 中的值0两个字符串的内容相等0第一个不匹配的字符在 PTR1 中的值大于在 PTR2 中的值
此函数开始比较每个字符串的第一个字符。如果它们彼此相等则继续下一对直到字符不同或达到终止空字符
例子
#include stdio.h
#include string.hint main()
{int ret strcmp(bbq, bcq);if (ret 0)printf(\n);printf(%d\n, ret);return 0;
}模拟实现
int my_strcmp(const char* str1, const char* str2)
{assert(str1 str2);while (*str1 *str2){if (*str1 \0)return 0;str1;str2;}return (*str1 - *str2);
}三、长度受限制的字符串函数
strncpy 功能从字符串中复制字符参数目的字符串destination源字符串source要从源中复制的最大字符数num返回值目的字符串拷贝num个字符从源字符串到目标空间如果源字符串的长度小于num则拷贝完源字符串之后在目标的后边追加0直到num个如果源长度超过 num则不会在目标末尾隐式附加空字符。因此在这种情况下不应将目标视为以空结尾的 C 字符串这样读取它会溢出目的地和来源不得重叠
例子
#include stdio.h
#include string.hint main()
{char str1[] To be or not to be;char str2[40];char str3[40];strncpy(str2, str1, sizeof(str2));strncpy(str3, str2, 5);str3[5] \0; puts(str1);puts(str2);puts(str3);return 0;
}strncat 功能从字符串追加字符参数目的字符串destination源字符串source要追加的最大字符数num返回值目的字符串将源的第一个数字字符追加到目标外加一个终止空字符如果源中 C 字符串的长度小于 num则仅复制终止空字符之前的内容目标空间必须足够大以包含串联的结果字符串包括其他 null 字符
例子
#include stdio.h
#include string.hint main()
{char str1[20];char str2[20];strcpy(str1, To be );strcpy(str2, or not to be);strncat(str1, str2, 6);puts(str1);return 0;
}strncmp 功能比较两个字符串的字符参数要比较的字符串1str1要比较的字符串2str2要比较i的最大字符数num返回值
返回值表明0不匹配的第一个字符在 str1 中的值低于 str2 中的值0两个字符串的内容相等0第一个不匹配的字符在 str1 中的值大于在 str2 中的值
将 C 字符串 str1 的字符数与 C 字符串 str2 的字符数进行比较此函数开始比较每个字符串的第一个字符。如果它们彼此相等则继续使用以下对直到字符不同直到达到终止的空字符或者直到两个字符串中的 num 字符匹配以先发生者为准
例子
#include stdio.h
#include string.hint 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]);}return 0;
}四、字符串查找
strstr 功能查找子字符串参数要扫描的字符串str1包含要匹配的字符序列的字符串str2返回值指向 str1 中指定的整个字符序列在 str2 中首次出现的指针如果序列在 str1 中不存在则为 null 指针
例子
#include stdio.h
#include string.hint main()
{char str[] This is a simple string;char* pch;pch strstr(str, simple);if (pch ! NULL)strncpy(pch, sample, 6);puts(str);return 0;
}模拟实现
char* my_strstr(const char* str1, const char* str2)
{char* cpstr1;char* s1str1;char* s2str2;if (*str2 \0)return str1;while (*cp){s1 cp;s2 str2;while (*s1 *s2 *s1 *s2){s1;s2;}if (*s2 \0)return cp;cp;}return NULL;
}strtok 功能将字符串拆分为标记参数要截断的c字符串str包含分割字符的c字符串delimiters返回值如果找到令牌则指向令牌开头的指针否则为空指针。当在正在扫描的字符串中到达字符串的末尾即空字符时始终返回空指针strtok函数找到str中的下一个标记并将其用 \0 结尾返回一个指向这个标记的指针。注strtok函数会改变被操作的字符串所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改strtok函数的第一个参数不为 NULL 函数将找到str中第一个标记strtok函数将保存它在字符串中的位置strtok函数的第一个参数为 NULL 函数将在同一个字符串中被保存的位置开始查找下一个标记
例子
#include stdio.h
#include string.hint main ()
{char str[] - This, a sample string.;char * pch;printf (Splitting string \%s\ into tokens:\n,str);pch strtok (str, ,.-);while (pch ! NULL){printf (%s\n,pch);pch strtok (NULL, ,.-);}return 0;
}五、错误信息报告
strerror 功能获取指向错误消息字符串的指针参数错误号errnum返回值指向描述错误错误的字符串的指针解释 errnum 的值生成一个字符串其中包含描述错误条件的消息就像由库的函数设置为 errno 一样
例子
#include stdio.h
#include string.h
int main()
{int i 0;for (i 0; i 10; i){printf(%d: %s\n, i, strerror(i));}return 0;
}六、字符分类函数
函数如果他的参数符合下列条件就返回真iscntrl任何控制字符isspace空白字符空格‘ ’换页‘\f’换行’\n’回车‘\r’制表符’\t’或者垂直制表符’\v’isdigit十进制数字 0~9isxdigit十六进制数字包括所有十进制数字小写字母a~f大写字母A ~Fislower小写字母a~zisupper大写字母A~Zisalpha字母a~ z或A~Zisalnum字母或者数字a ~ z,A~ Z,0~9ispunct标点符号任何不属于数字或者字母的图形字符可打印sgraph任何图形字符isprint任何可打印字符包括图形字符和空白字符
七、内存操作函数
memcpy 功能复制内存块参数指向目标数组的指针destinatiom指向要复制的数据源的指针source要复制的字节数num返回值返回目标函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置这个函数在遇到 ‘\0’ 的时候并不会停下来如果source和destination有任何的重叠复制的结果都是未定义的
例子
#include stdio.h
#include string.hint main()
{int arr1[] { 1,2,3,4,5,6,7,8,9,10 };int arr2[20] { 0 };//将arr1中的内容拷贝到arr2中memcpy(arr2, arr1, 40); int i 0;for (i 0; i 20; i){printf(%d , arr2[i]);}return 0;
} 模拟实现
void* my_memcpy(void* dest, const void* src, size_t num)
{void* ret dest;assert(dest src);while (num--){*(char*)dest *(char*)src;dest (char*)dest 1;src (char*)src 1;}return ret;
}memmove 功能移动内存块参数指向目标数组的指针destinatiom指向要复制的数据源的指针source要复制的字节数num返回值返回目标将字节数的值从源指向的位置复制到目标指向的内存块。复制就像使用了中间缓冲区一样允许目标和源重叠该函数不检查源中的任何终止空字符 - 它总是准确地复制字节数
例子
#include stdio.h
#include string.h
int main()
{char str[] memmove can be very useful......;memmove(str 20, str 15, 11);puts(str);return 0;
}模拟实现
void* my_memmove(void* dest, const void* src, size_t num)
{void* ret dest;assert(dest src);if (dest src){while (num--){*(char*)dest *(char*)src;dest (char*)dest 1;src (char*)src 1;}}else{while (num--){*((char*)dest num) *((char*)src num);}}return ret;
}memcmp 功能比较两个内存块参数指向内存块的指针1str1指向内存块的指针2str2要比较的字节数num返回值
返回值表明0两个内存块中不匹配的第一个字节在 PTR1 中的值低于 PTR2 中的值0两个内存块的内容相等0两个内存块中不匹配的第一个字节在 PTR1 中的值大于在 PTR2 中的值
与 strcmp 不同该函数在找到空字符后不会停止比较
例子
#include stdio.h
#include string.h
int main()
{int arr1[] { 1,2,1,4,5,6 };int arr2[] { 1,2,33 };int ret memcmp(arr1, arr2, 10);printf(%d\n, ret);return 0;
}