常用的C标准库函数

整理常见的C标准库函数。会不断更新。

  • strcpy
  • sprintf
  • puts
  • memset
  • snprintf
  • printf
  • malloc
  • realloc
  • strcat
  • strstr
  • strcmp

strcpy

char *strcpy(char *dest, const char *src)

把 src 所指向的字符串复制到 dest,返回一个指向最终的目标字符串 dest 的指针。

#include 
#include 

int main()
{
    char src[40];

    strcpy(src, "This is runoob.com");

    printf("最终的目标字符串: %s\n", src);

    return(0);
}
最终的目标字符串: This is runoob.com

sprintf

int sprintf(char *str, const char *format, ...)
  • str -- 这是指向一个字符数组的指针,该数组存储了 C 字符串。
  • format -- 格式化后的字符串

把格式化后的字符串存储到到 str 所指向的字符串。
如果成功,则返回写入的字符总数,不包括字符串追加在字符串末尾的空字符。如果失败,则返回一个负数。

#include 
#include 

int main()
{
    char str[80];

    sprintf(str, "Pi 的值 = %f", M_PI);
    puts(str);

    return(0);
}
Pi 的值 = 3.141593

puts

int puts(const char *str) // str -- 这是要被写入的 C 字符串

把一个字符串写入到标准输出 stdout,直到空字符,但不包括空字符。换行符会被追加到输出中。
如果成功,该函数返回一个非负值为字符串长度(包括末尾的 \0),如果发生错误则返回 EOF。

#include 
#include 

int main()
{
    char str1[15];
    char str2[15];

    strcpy(str1, "BEIJING");
    strcpy(str2, "SHANGHAI");

    puts(str1);
    puts(str2);

    return(0);
}
BEIJING
SHANGHAI

memset

void *memset(void *str, int c, size_t n)

复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。
注意:要被设置的值。该值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符形式。
该值返回一个指向存储区 str 的指针。

#include 
#include 

int main ()
{
    char str[50];

    strcpy(str,"This is string.h library function");
    puts(str);

    memset(str,'$',7);
    puts(str);

    return(0);
}
This is string.h library function
$$$$$$$ string.h library function

snprintf

int snprintf ( char * str, size_t size, const char * format, ... );

设将可变参数(...)按照 format 格式化成字符串,并将字符串复制到 str 中,size 为要写入的字符的最大数目,超过 size 会被截断.
参数含义:
str -- 目标字符串,size -- 拷贝字节数(Bytes),format -- 格式化成字符串,... -- 可变参数.
返回值含义:
1.如果格式化后的字符串长度小于 size,则会把字符串全部复制到 str 中,并给其后添加一个字符串结束符 \0.
2.如果格式化后的字符串长度大于等于 size,超过 size 的部分会被截断,只将其中的 (size-1) 个字符复制到 str 中,并给其后添加一个字符串结束符 \0,返回值为欲写入的字符串长度.
示例:

#include 

int main()
{
    char buffer[50];
    char* s = "runoobcom";

    // 读取字符串并存储在 buffer 中
    int j = snprintf(buffer, 6, "%s\n", s);

    // 输出 buffer及字符数
    printf("string:\n%s\ncharacter count = %d\n", buffer, j);

    return 0;
}
string:
runoo
character count = 10

printf

  • %p会把值作为一个地址输出。
int i=0; printf("%p",&i); 执行结果: 0xbffb2d6a 。%p是将&i这个值作为地址输出,并以0x开头16进制类型输出出来
  • %u对int型和unsigned int型都可以,表示输入输出格式为无符号int型。
int a=-1; unsigned int b ;
b=a; printf("%d\t %u\t %d\t %u",a,a,b,b); \\ \t是制表符,
执行结果:-1 4294967295 -1 4294967295
  • %lu对unsigned long型,无符号长整数型

malloc

void *malloc(size_t size)

函数说明: 分配所需的内存空间,并返回一个指向它的指针.
参数说明: size: 内存块的大小,以 字节 为单位。
返回值说明: 返回一个void指针,如果分配失败,返回 NULL。
示例:

#include 
#include 
#include 

int main()
{
    char *c;
    c = (char*)malloc(sizeof(char));
    strcpy(c,"helloworld");
    printf("c = %s.",c);
    free(c);
    return 0;
}

realloc

void *realloc(void *ptr, size_t size)

函数说明: 尝试重新调整之前调用 malloc 或 calloc 所分配的 ptr 所指向的内存块的大小.
参数说明:

  1. ptr: 指针指向一个要重新分配内存的内存块,该内存块之前是通过调用 malloc、calloc 或 realloc 进行分配内存的。如果为空指针,则会分配一个新的内存块,且函数返回一个指向它的指针.
  2. size: 内存块的新的大小,以字节为单位。如果大小为 0,且 ptr 指向一个已存在的内存块,则 ptr 所指向的内存块会被释放,并返回一个空指针.

返回值说明:
该函数返回一个指针 ,指向重新分配大小的内存。如果请求失败,则返回 NULL.
示例:

#include 
#include 
#include 

int main()
{
    char *c;
    c = (char*)malloc(sizeof(char));
    strcpy(c,"helloworld");
    printf("malloc c = %s.\n",c);

    c = (char*)realloc(c,2 * sizeof(char));
    strcat(c,"+hellobeijing");
    printf("realloc c = %s.\n",c);
    
    free(c);
    return 0;
}
malloc c = helloworld.
realloc c = helloworld+hellobeijing.

strcat

char *strcat(char *dest, const char *src)

函数说明: 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾.
参数说明:

  1. dest: 指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串.
  2. src: 指向要追加的字符串,该字符串不会覆盖目标字符串.

返回值:
该函数返回一个指向最终的目标字符串 dest 的指针.
示例:

同上一个示例.

strstr

char *strstr(const char *haystack, const char *needle)

C 库函数 char *strstr(const char *haystack, const char *needle) 在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'其中haystack是要被检索的 C 字符串,needle是在 haystack 字符串内要搜索的小字符串。该函数返回在 haystack 中第一次出现 needle 字符串的位置,如果未找到则返回 null。参数和返回值都是指针类型。

#include 
#include

int main()
{
    const char* p1 = "abcdefgh";//"abcdefgh"是常属性字符串,里面的内容无法被改变,在char*前加const
    const char* p2 = "def";
    const char* p3 = "hello";
    char* ret = strstr(p1, p2);//把返回的字符串首地址赋给ret
    char* ret1 = strstr(p1, p3);//把返回的字符串首地址赋给ret
    if (ret == NULL)
    {
        printf("ret = 子串不存在\n");//当返回的字符串首地址为空,ret为一个空指针,代表不存在该子串
    }
    else
    {
        printf("ret = %s\n", ret);//当返回的字符串首地址不为空,则会从字符串首地址开始打印,到‘\0’停止
    }
    if (ret1 == NULL)
    {
        printf("ret1 = 子串不存在\n");//当返回的字符串首地址为空,ret为一个空指针,代表不存在该子串
    }
    else
    {
        printf("ret1 = %s\n", ret1);//当返回的字符串首地址不为空,则会从字符串首地址开始打印,到‘\0’停止
    }
    return 0;
}
ret = defgh
ret1 = 子串不存在

strcmp

把两个字符串做比较。如果返回值小于 0,则表示 前者 小于 后者。如果返回值大于 0,则表示 前者 大于 后者。如果返回值等于 0,则表示前者 等于 后者。

#include 

int main() {
    char t_str_1[10];
    char t_str_2[10];

    strcpy(t_str_1,"abcde");
    strcpy(t_str_1,"ABCDE");

    int ret;
    ret = strcmp(t_str_1,t_str_2);
    if (ret < 0){
        printf("t_str_1 < t_str_2");
    } else if (ret > 0){
        printf("t_str_1 > t_str_2 ");
    } else {
        printf("t_str_1 = t_str_2");
    }

    return 0;
}

t_str_1 > t_str_2

参考:
https://blog.csdn.net/weixin_62677583/article/details/121353929
https://www.runoob.com/cprogramming/c-function-strstr.html

你可能感兴趣的:(常用的C标准库函数)