C语言中的常见函数
如果我们需要使用函数可以在下述网址进行相关函数的查询。 zh.cppreference.com/
实际例子:abs, labs, llabs, imaxabs
- 绝对值函数
在 C 语言中,绝对值函数用于计算整数的绝对值。这些函数在不同的头文件中定义,具体如下:
在
<stdlib.h>头文件中定义的函数
int abs(int n);计算int类型的绝对值。long labs(long n);计算long类型的绝对值。long long llabs(long long n);计算long long类型的绝对值。
这些函数从 C99 标准开始被定义。
在
<inttypes.h>头文件中定义的函数(C99 起)
intmax_t imaxabs(intmax_t n);计算intmax_t类型的绝对值。
参数
n- 一个整数值。
返回值
函数返回参数 n 的绝对值,即 |n|,如果结果可以被表示的话。
注意
在补码系统中,最小负值的绝对值是超出对应整数类型的范围的。例如,在 32 位补码系统中,INT_MIN 为 -2147483648,但其绝对值应该是 2147483648,这个值大于 INT_MAX 的值 2147483647。在这种情况下,行为是未定义的。
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int main(void)
{
printf("abs(+3) = %d\n", abs(+3));
printf("abs(-3) = %d\n", abs(-3));
// printf("%+d\n", abs(INT_MIN)); // 在补码系统上是未定义行为
}
输出
abs(+3) = 3
abs(-3) = 3
- 上述网站中提到的函数定义
函数是将一个标识符(函数名)关联到一条复合语句(函数体)的 C 语言构造。每个 C 程序都从 main 函数开始执行,也从它或者调用其他用户定义函数或库函数终止。
📚需求:
- 课堂练习:1ong类型的绝对值通过哪个函数获取呢?
- 1ong1ong类型的绝对值通过哪个函数获取呢?
- 小数的绝对值通过哪个函数获取呢?
9.1 C语言中的time函数
time函数是 C 语言标准库中的一个函数,用于获取自纪元(Epoch)以来的时间,即从 1970 年 1 月 1 日 00:00:00 UTC 到当前时间的秒数(不计闰秒)。time函数通常与日期和时间相关的函数一起使用,以便进行日期和时间的处理。
9.2 函数原型
time_t time(time_t *t);
-
参数
- t - 指向 time_t 对象的指针,该对象在成功时会被设置为当前时间的 time_t 表示。如果 t 为 NULL,则不会存储当前时间。
-
返回值
- 返回当前时间的 time_t 表示。如果发生错误,则返回 ((time_t)-1)。
#include <stdio.h>
#include <time.h>
int main() {
// 获取当前时间
time_t now = time(NULL);
// 打印当前时间
printf("Current time: %ld\n", (long)now);
// 转换为本地时间并打印
struct tm *ltm = localtime(&now);
printf("Local time: %s", asctime(ltm));
return 0;
}
在这个示例中,我们首先调用
time函数获取当前时间,并将其存储在now变量中。然后,我们使用localtime函数将time_t表示的时间转换为本地时间,并使用asctime函数将本地时间转换为字符串形式打印出来。
-
注意事项
- 1.time 函数返回的 time_t 类型是一个长整型,通常用于表示时间戳。 在多线程程序中,time 函数是线程安全的。
- 2.time 函数依赖于系统时钟和时区设置,因此在使用时需要注意时区问题。
- 3.由于 time 函数返回的时间戳是基于 UTC 时间的,如果需要处理本地时间,通常需要使用 localtime 或 gmtime 等函数进行转换。
9.3 C语言中比较重要的函数示例
strcmp函数:比较字符串
int strcmp(const char* str1, const char* str2)
{
while(*str1 == *str2 && *str1 != '\0')
{
++str1;
++str2;
}
return *str1 - *str2;
}
strcpy函数:复制字符串
char* strcpy(char *dst, const char *src)
{
assert((src != NULL) && (dst != NULL));
char *pStr = dst;
while ((*dst++ = *src++) != '\0') {}
return pStr;
}
strlen函数:计算字符串长度
unsigned int Strlen(const char * str)
{
unsigned int length=0;
assert(str!=NULL);
while(str[length]!='\0')
{
length++;
}
return length;
}
strcat函数:拼接字符串
char* strcat(char* dst, const char* src)
{
char* ret = dst;
while(*dst != '\0')
++dst;
while((*dst++ = *src) != '\0');
return ret;
}
memcmp函数:内存字节比较
int memcmp(const void *buffer1,const void *buffer2,int count)
{
if (!count)
return(0);
while ( --count && *(char *)buffer1 == *(char *)buffer2)
{
buffer1 = (char *)buffer1 + 1;
buffer2 = (char *)buffer2 + 1;
}
return( *((unsigned char *)buffer1) - *((unsigned char *)buffer2) );
}
memcpy函数:内存拷贝
void* my_memcpy(void* dst, const void* src, size_t n)
{
char *tmp = (char*)dst;
char *s_src = (char*)src;
while(n--) {
*tmp++ = *s_src++;
}
return dst;
}
memmove函数:内存拷贝(考虑内存重叠)
void* memmove(void* dst, const void* src, size_t n)
{
char* s_dst;
char* s_src;
s_dst = (char*)dst;
s_src = (char*)src;
if(s_dst>s_src && (s_src+n>s_dst)) {
s_dst = s_dst+n-1;
s_src = s_src+n-1;
while(n--) {
*s_dst-- = *s_src--;
}
} else {
while(n--) {
*s_dst++ = *s_src++;
}
}
return dst;
}
memset函数:设置内存内容
void * memset(void *s, int ch, size_t n)
{
int i=0;
while(i<n)
{
*((char*)s+i)=ch;
i++;
}
return s;
}