1字符分类函数
作用:字符分类
头文件:ctype.h
例子
int islower ( int c );
这里参数为什么不是字符型而是整型?
2.字符转换函数
c语言中有两种
int tolower ( int c ); // 将参数传进去的⼤写字⺟转⼩写int toupper ( int c ); // 将参数传进去的⼩写字⺟转⼤写
字母大小写的转换虽然我们可以通过加减32来换算,现在我们有了函数,就可以直接用函数,方便。
# include <stdio.h># include <ctype.h>int main (){int i = 0 ;char str[] = "Test String.\n" ;char c;while (str[i]){c = str[i];if ( islower (c))c = toupper (c);putchar (c);i++;}return 0 ;}
3.strlen <string.h>
size_t strlen ( const char * str );
之前已经详细了解过,这里不再赘述,只强调一点
strlen的返回数值是无符号的整数,下列代码相减,数值上应该是-3,但是无符号整型没有符号位,-3的反码是11111111 11111111 11111101,是一个巨大的正整数,所以代码有问题 。
#include <stdio.h>
#include <string.h>
int main()
{
const char* str1 = "abcdef";
const char* str2 = "bbb";
if(strlen(str2) - strlen(str1) > 0)
{
printf("str2 > str1\n");
}
else
{
printf("srt1 > str2\n");
}
return 0;
}
strlen函数的三种模拟实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<assert.h>
#include<stdio.h>
//strlen的第三种实现形式
int my_strlen(const char* str)
{
int count = 0;
assert(str);
while (*str)
{
count++;
str++;
}
return count;
}
int my_strlen(const char*str)
{
assert(str);
const char* p = str;
while (*str)
{
str++;
}
return str - p;
}
int my_strlen(const char* str)
{
assert(str);
if (*str == '\0')
return 0;
else
return 1 + my_strlen(str + 1);
}
int main()
{
const char* p = "abc";
printf("%d", my_strlen(p));
return 0;
}
4.strcpy <string.h>
功能:拷贝字符串到\0为止。
char* strcpy(char * destination, const char * source );
返回目标空间起始地 目标空间地址 源空间地址
用法:
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[10] = {0};
char arr2[] = "hello";
strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
注意:
源字符串必须以 '\0' 结束。
会将源字符串中的 '\0' 拷⻉到⽬标空间。
⽬标空间必须⾜够⼤,以确保能存放源字符串。
⽬标空间必须可修改。
模拟实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<assert.h>
#include<stdio.h>
char* my_strcpy(char* dest, const char* src)
{
char* ret = dest;
assert(dest != NULL);
assert(src != NULL);
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[100] = { '0'};
char arr2[] = "hellow";
printf("%s", my_strcpy(arr1, arr2));
return 0;
}
5.stract
char * strcat ( char * destination, const char * source );
功能:追加字符串。
返回目标空间的起始地址。
用法:
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
注意:
源字符串必须以 '\0' 结束。
⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。
⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
⽬标空间必须可修改。
模拟实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include<assert.h>
#include<stdio.h>
char* my_strcat(char* dest, const char* src)
{
char* ret = dest;
assert(dest != NULL);
assert(src != NULL);
while(*dest)
{
;
}
while ((*dest++ = *src++))
{
;
}
return ret;
}
int main()
{
char arr1[100] = "";
char arr2[] = "hellow";
printf("%s", my_strcat(arr1, arr2));
return 0;
}
6.strcmp
前边介绍过,不再赘述
7strncpy
char * strncpy ( char * destination, const char * source, size_t num );
和str相比多了个长度
功能:
按照指定长度copy源空间的字符覆盖到目标空间
用法:
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[20] = {0};
char arr2[] = "abcdefghi";
char* str = strncpy(arr1, arr2, 5);
printf("%s\n", arr1);
printf("%s\n", str);
return 0;
}
注意:
strncpy 函数指定了拷⻉的⻓度,源字符串不⼀定要有 \0
源空间字符不够时用时,用 默认值来填充,来保证覆盖目标空间被覆盖指定长度
8.strncat
char * strncat ( char * destination, const char * source, size_t num );
功能:
像目标空间添加指定长度的源空间字符串
同样源空间的字符串不再需要\0
用法:
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
char* str = strncat(arr1, arr2, 5);
printf("%s\n", arr1);
printf("%s\n", str);
return 0;
}
9.strncmp
int strncmp ( const char * str1, const char * str2, size_t num );
功能:
字符串⽐较;⽐较 str1 和 str2 指向的两个字符串的内容,最多⽐较 num 字符。
返回值:
使用:
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abcqw";
int ret1 = strncmp(arr1, arr2, 3);
printf("%d\n", ret1);
int ret2 = strncmp(arr1, arr2, 4);
printf("%d\n", ret2);
return 0;
}