C語(yǔ)言詳細(xì)分析常見字符串函數(shù)與模擬實(shí)現(xiàn)
一. strlen(求長(zhǎng)度)
size_t strlen ( const char * str )
函數(shù)的返回值類型為size_t,為無(wú)符號(hào)數(shù),且strlen返回值為字符串中‘\0’前的字符個(gè)數(shù)。
猜猜這個(gè)程序的輸出
if (strlen("abc") - strlen("abcdef"))
{
printf(">");
}
else
{
printf("<");
}沒錯(cuò),是 >
因?yàn)閟trlen的返回值為無(wú)符號(hào)數(shù),-3變成了一個(gè)很大的正整數(shù)。
二. strcpy(拷貝)
char* strcpy (char * destination, const char * source)
使用時(shí),源字符串必須以\0結(jié)尾,并且'\0'也會(huì)拷過去
strcpy:"我不管你放不放得下,我就拷。"
目標(biāo)地址必須夠大且可修改,不然的話,雖然可以放進(jìn)去,但是程序會(huì)崩潰
strcpy的模擬實(shí)現(xiàn)
char* my_strcpy(char* dest,const char* source)
{
assert(dest && source);
char* ret = dest;
while (*dest++ = *source++);
return ret;
}三.strcat(追加)
char * strcat ( char * destination , const char * souce)
源字符串必須有'\0',目標(biāo)字符串也得有'\0'
追加后,目標(biāo)空間的'\0'無(wú)了,源字符串的'\0'添加上
目標(biāo)地址必須夠大且可修改
strcat的模擬實(shí)現(xiàn)
char* my_strcat(char* dest,char* source)
{
assert(dest && source);
char* ret = dest;
while (*dest)
{
dest++;
}
while (*dest++ = *source++);
return ret;
}四.strcmp
int strcmp(const char* string1, const char * string2)
strcmp函數(shù)比較的不是字符串的函數(shù)長(zhǎng)度`
而是比較字符串中對(duì)應(yīng)位置上的字符的大小,如果相同,就比較下一對(duì)字符,知道不同,或者遇到'\0'.
若相同則返回0,若大于則返回大于零的數(shù)。若小于則返回小于零的數(shù)
strcmp的模擬實(shí)現(xiàn)
int my_strcmp(const char* str, const char* qtr)
{
assert(str && qtr);
while (*str == *qtr)
{
if (*str == '\0')
return 0;
str++;
qtr++;
}
if (*str > *qtr)
return 1;
else
return -1;
}五.strncpy
char * strncpy ( char * dest, const char * source , size_t count)
作用是將源字符串的前count個(gè)字符拷貝到目標(biāo)字符串
char a[] = "abcd"; char b[] = "qwer"; strncpy(a,b,1);
如以上修改后字符串為qbcd
strncpy的模擬實(shí)現(xiàn)
#define _CRT_SECURE_NO_WARNINGS 1
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
void my_strncat(char*dest,char*src,size_t n)
{
int t = strlen(dest);
int f = strlen(src);
for (int i = 0; i < n; i++)
{
*(dest + i) = *src;
src++;
}
}
int main()
{
int n;
scanf("%d", &n);
char src[50], dest[50];
strcpy(dest, "NICE");
strcpy(src, "SHOOT");
my_strncat(dest,src,n);
printf("%s", dest);
}六.strncat
char * strncat ( char * dest , const char * source ,size_t count)
作用是將源字符串的前count個(gè)字符追加到dest后面、
并且會(huì)在結(jié)尾加上‘\0’
char arr1[]="abcdef\0xx"; char arr2[]="qwer"; strncat(arr1,arr2,2);
修改后為abcdefqw
strncat的模擬實(shí)現(xiàn)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
void my_strncpy(char* str, char* qtr, int size)
{
assert(str && qtr);
int t = strlen(str);
for (int i = 0; i < size ; i++)
{
*(str + t + i) = *qtr;
qtr++;
}
*(str + t + size) = '\0';
}
int main()
{
char src[50], dest[50];
strcpy(src, "A nice");
strcpy(dest, " BOYYYYYYY");
int n = 0;
scanf("%d", &n);
my_strncpy(src, dest, n);
printf("%s", src);
}七.strncmp
int strncm ( const char * str , const char * qtr , size_t num )
指定比較前num個(gè)字符,其他同strcmp一樣
八.strstr
const char * strstr ( const char * str1, const char * str2 );
char * strstr ( char * str1, const char * str2 );
用于查找子串,返回第一次找到的地址
九.strtok
char * strtok ( char * str , const char * sep)
參數(shù)sep是由分隔符組成的一個(gè)字符串
str為一個(gè)字符串,包含sep中零個(gè)或者多個(gè)分隔符.
strtok會(huì)找到str中第一個(gè)分隔符,并把其替換成'\0',返回一個(gè)指向這個(gè)分隔符的指針
若第一個(gè)參數(shù)為'\0'',則從上一波保存的位置向后查找另一個(gè)分隔符
若字符串中不存在更多的分隔符,則返回NULL指針
char a[] = "A@nice.boy";
char sep[] = "@.";
printf("%s", strtok(a, sep));
printf("%s", strtok(NULL, sep));如以上結(jié)果為Anice
char a[] = "A@nice.boy";
const char sep[] = "@.";
char arr[30];
char* str = NULL;
strcpy(arr, a);
for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
{
printf("%s", str);
}以上輸出為Aniceboy
十.strerror
char * strerror (int errnum )

errno是一個(gè)全局變量,記錄最后的錯(cuò)誤代碼,程序剛剛啟動(dòng)的時(shí)候,errno 被設(shè)置為 0;程序在運(yùn)行過程中,任何一個(gè)函數(shù)發(fā)生錯(cuò)誤都有可能修改 errno 的值,讓其變?yōu)橐粋€(gè)非零值,用以告知用戶發(fā)生了特定類型的錯(cuò)誤。
十一.memcpy
void * memcpy ( void* dest , const void * source ,size_t count)
作用是將源字符串的前count個(gè)字節(jié)拷貝到dest上
int a1[20] = {1,2,3,4,5,6,7,8};
int a2[5] = {0};
memcpy(a1,a2,20);執(zhí)行后,a1數(shù)組前五個(gè)元素變成0
memcpy的模擬實(shí)現(xiàn):
由于memcpy的拷貝是一個(gè)字節(jié)一個(gè)字節(jié)進(jìn)行的
可用以下代碼模擬實(shí)現(xiàn)
void* my_memcpy(void* dest, const void* source, size_t count)
{
assert(source && dest);
void* ret = dest;
while (count--)
{
*(char*)dest = *(char*)source;
source=(char*)source+1;
dest=(char*)dest+1;
}
return ret;
}十二.memmove
void * memmove (void * dest ,const void * source ,size_t count)
可以實(shí)現(xiàn)重疊內(nèi)存拷貝
模擬實(shí)現(xiàn):
void* my_memmove(void* dest, const void* source, size_t count)
{
if (dest < source)
{
while(count--)
{
*(char*)dest = *(char*)source;
dest = (char*)dest + 1;
source = (char*)source + 1;
}
}
else
{
while (count--)
{
*((char*)dest + count )= *((char*)source + count);
}
}
}十三.memcmp
void * memcpy ( void * str , const void * qtr , size_t count)
比較str和qtr的前count個(gè)字節(jié),注意是一個(gè)字節(jié)一個(gè)字節(jié)比較
這就很有意思了
請(qǐng)看以下代碼
int a[5] = { 1,2,3,4,5 };
int b[5] = { 1,2,3,4,0x11223305};
memcmp(a,b,16);很明顯數(shù)組的前十六個(gè)字節(jié)相同,會(huì)返回0,但如果是前十七個(gè)呢
這是因?yàn)?nbsp;
5存儲(chǔ)為 05 00 00 00
0x11223305為 05 33 22 11
十四.memset
void * memset ( void * dest , int c ,size_t count)
作用是將前count個(gè)字節(jié)改成參數(shù)c
int a[]={0,0x22222222};
memset(a,1,8);如以上a數(shù)組變?yōu)?x01010101,0x0101010101
到此這篇關(guān)于C語(yǔ)言詳細(xì)分析常見字符串函數(shù)與模擬實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C語(yǔ)言 常見字符串函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語(yǔ)言字符串函數(shù),字符函數(shù),內(nèi)存函數(shù)使用及模擬實(shí)現(xiàn)
- C語(yǔ)言超全面講解字符串函數(shù)
- C語(yǔ)言超詳細(xì)講解字符串函數(shù)和內(nèi)存函數(shù)
- C語(yǔ)言字符串函數(shù)與內(nèi)存函數(shù)精講
- C語(yǔ)言實(shí)例問題探究字符串函數(shù)的應(yīng)用
- C語(yǔ)言的字符函數(shù)和字符串函數(shù)詳解
- C語(yǔ)言進(jìn)階教程之字符函數(shù)&字符串函數(shù)
- C語(yǔ)言字符串函數(shù)介紹與模擬實(shí)現(xiàn)詳解
- C語(yǔ)言字符串函數(shù)模擬實(shí)現(xiàn)流程介紹
相關(guān)文章
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之平衡二叉樹(AVL樹)實(shí)現(xiàn)方法示例
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之平衡二叉樹(AVL樹)實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了C語(yǔ)言平衡二叉樹的相關(guān)定義與使用技巧,需要的朋友可以參考下2018-01-01
基于OpenCV?差分法實(shí)現(xiàn)綠葉識(shí)別
物體識(shí)別是圖像處理學(xué)在現(xiàn)實(shí)生活中較多的應(yīng)用之一,本文提供了一種相對(duì)簡(jiǎn)單的思路來(lái)實(shí)現(xiàn)綠葉識(shí)別,適合初學(xué)圖像處理的新人研究參考。感興趣的同學(xué)可以關(guān)注一下2021-11-11
C語(yǔ)言實(shí)現(xiàn)的一個(gè)萬(wàn)年歷小程序
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)的一個(gè)萬(wàn)年歷小程序,具有一定的參考價(jià)值,做C語(yǔ)言日期計(jì)算的朋友可以參考下2014-07-07
C++虛函數(shù)的實(shí)現(xiàn)機(jī)制分析
這篇文章主要介紹了C++虛函數(shù)的實(shí)現(xiàn)機(jī)制分析,需要的朋友可以參考下2014-07-07
c++ 動(dòng)態(tài)內(nèi)存分配相關(guān)總結(jié)
這篇文章主要介紹了c++ 動(dòng)態(tài)內(nèi)存分配相關(guān)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)和使用c++,感興趣的朋友可以了解下2021-02-02

