第 9 节-函数(二)

163 阅读4分钟

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 函数:复制字符串
charstrcpy(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 函数:拼接字符串
charstrcat(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 函数:内存拷贝
voidmy_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 函数:内存拷贝(考虑内存重叠)
voidmemmove(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;
}