【C語言】常用的字串函式及相關函式的自我實現

Jacky_Feng發表於2020-10-12

目錄

一、常用的庫函式

1.strlen()函式

2.strcpy() 函式

3.strcmp()函式

         4.strcat()函式

5. strchr() 函式

6. strrchr() 函式

7. strstr() 函式

二、常用字串函式的自我實現


一、常用的庫函式

1.strlen()函式

  • 用於求字串的長度。

strlen() 函式從字串的開頭位置依次向後計數,直到遇見'\0',然後返回計時器的值。最終統計的字串長度不包括'\0'。

  • 標頭檔案:string.h
  • 語法/原型:

size_t strlen(const char* str);

  • 引數: str 是指向字串的指標。
  • 返回值:字串 str 的長度(實際是字串有效位元組數)。
  • 【例項演示】
#include <stdio.h>
#include <string.h>

int main() {
	char str[] = { "abcd" };
	int len1=strlen(str);
	printf("字串長度(有效字元長度):length=%d\n", len1);
}

執行結果:

2.strcpy() 函式

  • 用於對字串進行復制(拷貝)。
  • 標頭檔案:string.h
  • 語法/原型:

char* strcpy(char* strDestination, const char* strSource);

引數說明:strDestination:目的字串;strSource:源字串。
strcpy() 會把 strSource 指向的字串複製到 strDestination。
必須保證 strDestination 足夠大,能夠容納下 strSource,否則會導致溢位錯誤。

  • 返回值:目的字串,也即 strDestination。
  • 【例項演示】
#include <stdio.h>
#include <string.h>

int main() {
	char dest[50] = { 0 };
	char src[50] = { "hello" };
	strcpy(dest, src);
	puts(dest);
	
}

執行結果:

3.strcmp()函式

  • 用於對兩個字串進行比較(區分大小寫)。
  • 標頭檔案:string.h
  • 語法/原型:

int strcmp(const char* stri1,const char* str2);

引數 str1 和 str2 是參與比較的兩個字串。
strcmp() 會根據 ASCII 編碼依次比較 str1 和 str2 的每一個字元,直到出現不到的字元,或者到達字串末尾(遇見\0)。

  • 返回值:

如果返回值 < 0,則表示 str1 小於 str2。

如果返回值 > 0,則表示 str2 小於 str1。

如果返回值 = 0,則表示 str1 等於 str2。

  • 【例項演示】
#include <stdio.h>
#include <string.h>

int main() {
	char str1[50] ="hello" ;
	char str2[50] = "world";
	int res=strcmp(str1, str2);

	if (res > 0) {
		printf("%s > %s\n",str1,str2);
	}
	else if(res==0){
		printf("%s = %s\n", str1, str2);
	}
	else {
		printf("%s < %s\n", str1, str2);
	}
}

執行結果:

4.strcat()函式

  • 用來將兩個字串連線(拼接)起來。
  • 標頭檔案:string.h
  • 語法/原型:

char*strcat(char* strDestination, const char* strSource);

引數說明:strDestination:目的字串;strSource:源字串。
strcat() 函式把 strSource 所指向的字串追加到 strDestination 所指向的字串的結尾,所以必須要保證 strDestination 有足夠的記憶體空間來容納兩個字串,否則會導致溢位錯誤。
注意:strDestination 末尾的'\0'會被覆蓋,strSource 末尾的'\0'會一起被複制過去,最終的字串只有一個'\0'

  • 返回值:指向 strDestination 的指標。
  • 【例項演示】
#include <stdio.h>
#include <string.h>

int main() {
	char str1[101] = { "hello" };
	char str2[50] = { "world" };
	strcat(str1, str2);
	puts(str1);
}

執行結果:

5. strchr() 函式

  • 用於查詢給定字串中某一個特定字元第一次出現的位置。
  • 標頭檔案:string.h
  • 語法/原型:

char* strchr(const char* str, char c);

引數說明:str:被查詢的字串; c:要查詢的字元。
strchr() 函式會依次檢索字串 str 中的每一個字元,直到遇見字元 c,或者到達字串末尾(遇見\0)。

  • 返回值:返回在字串 str 中第一次出現字元 c 的位置,如果未找到該字元 c 則返回 NULL。
  • 【例項演示】
#include <stdio.h>
#include <string.h>

int main(){
	char* str = "hello world";
	char c = 'l';
	char* p = strchr(str,c);
	if (p) {
		puts("Found");
		printf("字元%c第一次出現的位置(下標)為:%d\n",c,(p-str)/sizeof(char));
	}
	else {
		puts("Not found");
	}
	return 0;
} 

執行結果:

6. strrchr() 函式

  • 用於查詢給定字串中某一個特定字元最後一次出現的位置。
  • 標頭檔案:string.h
  • 語法/原型:

char* strrchr(const char* str, char c);

引數說明:str:被查詢的字串; c:要查詢的字元。

  • 返回值:返回在字串 str 中最後一次出現字元 c 的位置,如果未找到該字元 c 則返回 NULL。
  • 【例項演示】
#include <stdio.h>
#include <string.h>

int main(){
	char* str = "hello world";
	char c = 'l';
	char* p = strrchr(str,c);
	if (p) {
		puts("Found");
		printf("字元%c最後一次出現的位置(下標)為:%d\n",c,(p-str)/sizeof(char));
	}
	else {
		puts("Not found");
	}
	return 0;
} 

執行結果:

7. strstr() 函式

  • 用於在給定字串中查詢某一個特定子串。
  • 標頭檔案:string.h
  • 語法/原型:

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

引數說明:haystack:源字串;needle:子字串。

  • 返回值:返回在 haystack 中第一次出現 needle 字串的位置,如果未找到則返回 NULL。
  • 【例項演示】
#include <stdio.h>
#include <string.h>

int main(){
	char* str1 = "hello world";
	char* str2 = "or";
	char* p = strstr(str1,str2);
	if (p) {
		puts("Found");
		printf("字元%s第一次出現的位置(下標)為:%d\n",str2,(p-str1)/sizeof(char));
	}
	else {
		puts("Not found");
	}
	return 0;
} 

執行結果:


二、常用字串函式的自我實現

1.求字串的長度

#include <stdio.h>
#include <string.h>

int Length(const char* str) {
	int len = 0;
	assert(str);
	while (*str != '\0') {
		len++;
		str++;
	}
	return len;
}

int main() {
	const char* str1 = "hello world";
	printf("字串長度:%d\n", Length(str1));
}

執行結果:

2.字串拷貝函式

#include <stdio.h>
#include <assert.h>

char* Mystrcpy(char* dest, const char* src) {
	assert(dest);
	assert(src);
	char* p = dest;
	while (*src != '\0') {
		*dest = *src;
		dest++;
		src++;
	}
	*dest = '\0';
	return p;
}
int main() {
	char str1[1024] = "hello" ;
	const char* str2 = "world";
	printf("字串str1替換為:%s\n", Mystrcpy(str1,str2));

執行結果:

3.字串連線函式

#include <stdio.h>
#include <assert.h>

char* Mystrcat(char* dest, const char* src) {
	assert(dest);
	assert(src);
	char* p = dest;
	while (*dest != '\0') {
		dest++;
	}
	while (*src != '\0') {
		*dest = *src;
		dest++;
		src++;
	}
	*dest = '\0';
	return p;
}

int main() {
	char str1[1024] = "hello" ;
	const char* str2 = "world";
	printf("字串str1連線為:%s\n", Mystrcat(str1, str2));
}

執行結果:

4.字串比較函式

#include <stdio.h>
#include <assert.h>

int Mystrcmp(const char* dest, const char* src) {
	assert(dest);
	assert(src);
	while (*dest == *src) {
		if (*dest == '\0') {
			return 0;
		}
		dest++;
		src++;
	}
	return (*dest - *src);
}
int main() {
	const char* str1 = "hello";
	const char* str2 = "world";
	printf("%d\n", Mystrcmp(str1, str2));
}

執行結果:

5.在字串中查詢指定字元第一次出現的位置

#include <stdio.h>
#include <assert.h>

char* Mystrrchr(const char* str, char c) {
	assert(str);
	char* p = (char*)str;
	while (*p != c) {
		if (*p == '\0') {
			return NULL;
		}
		p++;
	}
	return p;
}

int main() {
	const char* str1 = "hello";
	char ch = 'o';
	char* p= Mystrrchr(str1,ch);
	if (p == NULL) {
		printf("Not found");
	}
	else {
		printf("字元%c第一次出現位置(下標):%d\n",ch, (p-str1)/sizeof(char));
	}
	
}

執行結果:

 

 

相關文章