整理常見的C標準庫函數。會不斷更新。
- strcpy
- sprintf
- puts
- memset
- snprintf
- printf
- malloc
- realloc
- strcat
- strstr
- strcmp
strcpy
char *strcpy(char *dest, const char *src)
把 src 所指向的字符串復制到 dest,返回一個指向最終的目標字符串 dest 的指針。
#include <stdio.h>
#include <string.h>
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 <stdio.h>
#include <math.h>
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),如果發(fā)生錯誤則返回 EOF。
#include <stdio.h>
#include <string.h>
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 形式傳遞,但是函數在填充內存塊時是使用該值的無符號字符形式。
該值返回一個指向存儲區(qū) str 的指針。
#include <stdio.h>
#include <string.h>
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 -- 拷貝字節(jié)數(Bytes),format -- 格式化成字符串,... -- 可變參數.
返回值含義:
1.如果格式化后的字符串長度小于 size,則會把字符串全部復制到 str 中,并給其后添加一個字符串結束符 \0.
2.如果格式化后的字符串長度大于等于 size,超過 size 的部分會被截斷,只將其中的 (size-1) 個字符復制到 str 中,并給其后添加一個字符串結束符 \0,返回值為欲寫入的字符串長度.
示例:
#include <stdio.h>
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); 執(zhí)行結果: 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是制表符,
執(zhí)行結果:-1 4294967295 -1 4294967295
- %lu對unsigned long型,無符號長整數型
malloc
void *malloc(size_t size)
函數說明: 分配所需的內存空間,并返回一個指向它的指針.
參數說明: size: 內存塊的大小,以 字節(jié) 為單位。
返回值說明: 返回一個void指針,如果分配失敗,返回 NULL。
示例:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
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 所指向的內存塊的大小.
參數說明:
- ptr: 指針指向一個要重新分配內存的內存塊,該內存塊之前是通過調用 malloc、calloc 或 realloc 進行分配內存的。如果為空指針,則會分配一個新的內存塊,且函數返回一個指向它的指針.
- size: 內存塊的新的大小,以字節(jié)為單位。如果大小為 0,且 ptr 指向一個已存在的內存塊,則 ptr 所指向的內存塊會被釋放,并返回一個空指針.
返回值說明:
該函數返回一個指針 ,指向重新分配大小的內存。如果請求失敗,則返回 NULL.
示例:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
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 所指向的字符串的結尾.
參數說明:
- dest: 指向目標數組,該數組包含了一個 C 字符串,且足夠容納追加后的字符串.
- 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 <stdio.h>
#include<string.h>
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 <iostream>
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