我想我们在刚开始学习c语言是应该就使用过strcpu,strcmp,strcat这类的函数。我不知道你们在使用这些函数时有没有感到很轻松,可以省不少时间不用去编写一些功能,有没有困惑为什么只有对字符类型的使用,其实对于这类函数c语言中还有不少,今天我把一些我觉得挺有用的一些函数列出来希望能对你有一点帮助。(目录跳转文章链接不能用,不知道为啥(),但是跳转cplusplus的没问题)
目录
C语⾔内存函数- 2
字符分类函数(头文件全是)ctype.h
函数 | 如果他的参数符合下列条件就返回真 |
Iscntrl | 任何控制字符 |
Isspace | 空白字符:空格‘’,换页’f’,换行'\n',回车“r’,制表符’\t'或者垂直制表符’\v' |
isdigit | 十进制数字0~9 |
isxdigit | 十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A~F |
islower | 小写字母a~z |
isupper | 大写字母A~Z |
isalpha | 字母a~z或A~Z |
isalnum | 字母或者数字,a~z,A~Z,0~9 |
ispunct | 标点符号,任何不属于数字或者字母的图形字符(可打印) |
isgraph | 任何图形字符 |
isprint | 任何可打印字符,包括图形字符和空白字符 |
这些函数用法很相似这是c语言的一个官网,它可以查询函数的用法cppreference.com(英文版)
cppreference.com(中文版)
或者你可以下一个MSDN,下载方法不难这里我就不赘述了。
我也将举几个例子希望能帮助到大家
int islower( int c ); islower 是能够判断参数部分的 c 是否是⼩写字⺟的。通过返回值来说明是否是⼩写字⺟,如果是⼩写字⺟就返回⾮0的整数,如果不是⼩写字⺟,返回 0。
#include <stdio.h>
#include <ctype.h>
int main()
{
int i = 0;
char str[] = "Hello World.\n";
char c;
while (str[i])
{
c = str[i];
if (islower(c))
c -= 32;
putchar(c);
i++;
}
return 0;
}
我想你们应该发现了这是一个将字符串中的⼩写字⺟转⼤写,其他字符不变的代码,我们把小写转成大写是采用-32的方法(ASCLL:A-65,a-97),其实也有库函数
int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写
int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写
#include <stdio.h>
#include <ctype.h>
int main()
{
int i = 0;
char str[] = "Hello World.\n";
char c;
while (str[i])
{
c = str[i];
if (islower(c))
c = toupper(c);
putchar(c);
i++;
}
return 0;
}
1. memcpy 使⽤和模拟实现
1 void * memcpy ( void * destination, const void * source, size_t num );
#include <stdio.h>
#include <string.h>
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
memcpy(arr2, arr1, 20);//20是20字节,也就是5个int
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);//5 5 5 5 5 0 0 0 0 0
}
return 0;
}
对于这个函数可以自己模拟实现下,我下面提供一个我写的,大家可以参考一下
//模拟实现memcpy
void* my_memcpy(void* dest, const void* src, size_t count)
{
assert(dest && src);
void* ret = dest;
while (count--)
{
*((char*)dest) = *((char*)src);
dest = ((char*)dest) + 1;
src = ((char*)src) + 1;
}
return ret;
}
int main()
{
int dest[100];
int src[] = {1,2,3,5,4,8,9,6,45,8,6,2,365,6};
size_t sz = sizeof(src) / sizeof(src[0]);
my_memcpy(dest,src, sizeof(int)*sz);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", *(dest + i));
}
return 0;
}
我的代码和VS提供的有点出入,我的代码无法复制空间有重叠的,不过这不是BUG因为标准并未要求,对于空间有重叠的一般使用memmove这个函数(对于空间重叠的理解如下图,dest是复制目标,src是复制内容来源)
而对于memmove使用有些memmove上文很像,
2.memmove使⽤和模拟实现
void * memmove ( void * destination, const void * source, size_t num ); 模拟实现略有不同,我只提供模拟实现(代码中后->前的意思是对于src对dest赋值而言的,具体可以看着上图用笔写一下就知道了)
void* my_memmove(void* dest, const void* src, size_t count)
{
assert(dest && src);
void* ret = dest;
while (count--)
{
//src < dest 后->前
if (src < dest)
{
*((char*)dest+count) = *((char*)src+count);
}
else if (src == dest)
{
break;
}
else
{
*((char*)dest) = *((char*)src);
dest = ((char*)dest) + 1;
src = ((char*)src) + 1;
}
}
return ret;
}
int main()
{
int dest[100];
int src[] = { 1,2,3,5,4,8,9,6,45,8,6,2,365,6 };
my_memmove(src+2, src, sizeof(int) * 4);
int i = 0;
for (i = 0; i < 14; i++)
{
printf("%d ", *(src + i));
}
return 0;
}
3. memset函数的使⽤
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] = "hello world";
memset (str,'x',6);
printf(str);//一种用法
return 0;
}
对于memset有个注意事项就是它是以字节为单位,用的时候要注意
int main()
{
int arr[] = { 1,2,3,4,5 };
memset(arr, 1, 20);
for (int i = 0; i < 5; i++)
{
printf("%d ", arr[i]);
}
//打印出16843009 16843009 16843009 16843009 16843009,原因下图内存
return 0;
}
4. memcmp函数的使⽤
对于该函数的返回值有什么区别我就不说了(因为太晚了我要睡觉了()),点击memcmp有链接,它会跳转。
#include <stdio.h>
#include <string.h>
int main()
{
char buffer1[] = "DWgaOtP12df0";
char buffer2[] = "DWGAOTP12DF0";
int n;
n = memcmp(buffer1, buffer2, sizeof(buffer1));
if (n > 0)
printf("'%s' is greater than '%s'.\n", buffer1, buffer2);
else if (n < 0)
printf("'%s' is less than '%s'.\n", buffer1, buffer2);
else
printf("'%s' is the same as '%s'.\n", buffer1, buffer2);
return 0;
}
最后谢谢你的阅读,希望这篇文章对你有点帮助!