字串函式:
- 前言:
- 1、strlen函式
- 2、strcpy函式
- 3、strcat函式
- 4、strcmp 函式
- 5、strncpy函式
- 6、strncat函式
- 7、strncmp函式
- 8、strstr函式
- 9、strtok函式
- 10、strerror函式
前言:
C語言中對字符和字串的處理很是頻繁,但是C語言本身是沒有字串型別的,字串通常放在常量字串中或者字符陣列中,
字串常量:適用于那些對它不做修改的字串函式
C語言規定了一個字串結束標志,以字符’\0’作為結束符,字串處理函式包含在<string.h>頭檔案中,常見的處理字符陣列有:
1、strlen函式
strlen函式的功能為:計算字串長度
strlen 函式的引數型別和回傳型別
size_t strlen ( const char * str );
- 字串以 ‘\0’ 作為結束標志,strlen 函式回傳的是在字串中 ‘\0’ 前面出現的字符個數(不包含 ‘\0’ ),
- 引數指向的字串必須要以 ‘\0’ 結束,
- 注意函式的回傳值為size_t,是無符號的( 易錯 )
易錯代碼:
#include <stdio.h>
int main()
{
const char*str1 = "abcdef";
const char*str2 = "bbb";
if(strlen(str2)-strlen(str1)>0)
{
printf("str2>str1\n");
}
else
{
printf("srt1>str2\n");
}
return 0;
}
輸出結果為:str2>str1
因為strlen回傳是無符號的,所以兩個無符號的數相級訓是正數,
模擬實作
第一種方法:
計數器方式:
size_t my_strlen(char* arr)
{
int count = 0;
while (*arr)
{
arr++;
count++;
}
return count;
}
int main()
{
char arr[] = "abcdef";
int ret = 0;
ret = my_strlen(arr);
printf("%d\n",ret);
return 0;
}
第二種方法
指標 - 指標方式
#include<stdio.h>
size_t my_strlen(int* s)
{
char* p = s;
while (*p)
{
p++;
}
return p - s; //指標-指標的值是:兩個指標之間相差幾個元素
}
int main()
{
char arr[] = "abcdef";
int ret = 0;
ret = my_strlen(arr);
printf("%d\n",ret);
return 0;
}
第三種方法
不創建臨時變數 —— 用遞回的方式
#include<stdio.h>
int my_strlen(char* p)
{
if (*p == '\0')
{
return 0;
}
return 1 + my_strlen(++p);
}
int main()
{
char arr[] = "abcdef";
int ret = 0;
ret = my_strlen(arr);
printf("%d\n",ret);
return 0;
}
2、strcpy函式
strcpy 函式的功能為:字串拷貝 —— 把一個字串拷貝到另一個字符陣列中
strcpy 函式的引數型別和回傳型別
char* strcpy(char * destination, const char * source );
const char * source —— 被拷貝的字串
char * destination —— 字串拷貝放到 destination 中
- 源字串必須以 ’ \0 ’ 結束,
- 會將源字串中的 ’ \0 ’ 拷貝到目標空間,
- 目標空間必須足夠大,以確保能存放源字串,
- 目標空間必須可變,
模擬實作:
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* arr1, const char* arr2)
{
char* tem = arr1;
assert(arr2);
while (*arr1++ = *arr2++)
{
;
}
return tem;
}
int main()
{
char arr1[] = "xxxxxxxxx";
char arr2[] = "abcd";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
3、strcat函式
strcat 函式的功能為:字串追加 —— 在一個字串后面加上另外一段字串
strcat 函式的引數型別和回傳型別
char * strcat ( char * destination, const char * source );
const char * source —— 要追加的字串
char * destination —— 把字串追加到 destination 字串后面、
回傳值為目標空間的起始地址
- 源字串必須以 ‘\0’ 結束,
- 目標空間必須有足夠的大,能容納下源字串的內容,
- 目標空間必須可修改,
模擬實作:
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
//1.找到dest中字串末尾\0
while (*dest)
{
dest++;
}
//2.把src拷貝到dest末尾
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = "abcd";
char arr2[] = "efi";
printf("%s\n", my_strcat(arr1, arr2));
return 0;
}
4、strcmp 函式
strcmp 函式的功能為:比較兩個字串,比較的是字串的內容(ASCII值),不是長度
strcmp 函式的引數型別和回傳型別
int strcmp ( const char * str1, const char * str2 );
比較字串str1和str2的大小 —— 比較對應位置的ASCII的值
如果str1大于str2,則回傳一個大于零的數字
如果str1小于str2,則回傳一個小于零的數字
如果str1等于str2,則回傳一個等于零的數字
模擬實作:
#include<stdio.h>
int my_strcmp(char* src1, char* src2)
{
while (*src1 == *src2)
{
if (*src1 == '\0')
return 0;
src1++;
src2++;
}
return *src1 - *src2;
}
int main()
{
char arr1[] = "abc";
char arr2[] = "abcd";
int ret = my_strcmp(arr1, arr2);
if (ret == 0)
{
printf("相等\n");
}
else if (ret < 0)
{
printf("小于\n");
}
else
{
printf("大于\n");
}
return 0;
}
5、strncpy函式
前面的 strcpy 函式是長度不受限制的字串函式 —— 不夠安全
而 strncpy 是長度受限制的字串函式 —— 相對安全
strcpy 和 strncpy 的功能是一樣的
strncpy 函式的引數型別和回傳型別
char * strncpy ( char * destination, const char * source, size_t num );
我們可以比較一下strncpy函式和strcpy函式,發現strncpy多了一個引數num
size_t num —— num 表示要拷貝幾個字符
模擬實作:
#include<stdio.h>
#include<assert.h>
char* my_strncpy(char* dest, const char* src, int num)
{
assert(src);
char* tem = dest;
while (*dest++ = *src++)
{
num--;
if (num <= 0)
{
break;
}
}
if (*dest != '\0')
{
*dest = '\0';
}
else
{
int i = 0;
for (i = 0; i < num; i++)
{
if (*(tem + i) == '\0')
{
int j = i;
for (j = i; j < num; j++)
{
*dest = '\0';
}
break;
}
}
}
return tem;
}
int main()
{
char arr1[] = "xxxxxxxx";
char arr2[] = "abcd";
char* ret = my_strncpy(arr1, arr2, 6);
printf("%s\n", ret);
return 0;
}
6、strncat函式
strncat 函式的引數型別和回傳型別
char * strncat ( char * destination, const char * source, size_t num );
模擬實作:
#include<stdio.h>
char* my_strncat(char* dest, const char* src, int count)
{
while (*dest)
{
dest++;
}
while (*dest++ = *src++)
{
count--;
if (count < 0)
{
break;
}
}
}
int main()
{
char arr1[20] = "abcd";
char arr2[] = "efg";
char* ret = my_strncat(arr1, arr2, 3);
printf("%s\n", arr1);
return 0;
}
7、strncmp函式
strncmp 函式的引數型別和回傳型別
int strncmp ( const char * str1, const char * str2, size_t num );
模擬實作:
#include<stdio.h>
int my_strncmp(const char* str1, const char* str2, int count)
{
while (*str1 == *str2)
{
if (str1 == '\0')
{
return 0;
}
count--;
str1++;
str2++;
if (count <= 0)
{
return 0;
}
}
return *str1 - *str2;
}
int main()
{
char arr1[] = "abcd";
char arr2[] = "abcde";
int ret = my_strncmp(arr1, arr2, 4);
if (ret == 0)
{
printf("等于");
}
else if (ret < 0)
{
printf("小于");
}
else
{
printf("大于");
}
return 0;
}
8、strstr函式
strstr 函式的功能為:查找字串,在一個字串中查找另一個字串
strstr 函式的引數型別和回傳型別
char * strstr ( const char *str2, const char * str1);
在str2字串中查找str1字串,
模擬實作:
char* my_strstr (const char * str1, const char * str2)
{
char *cp = (char *) str1;
char *s1, *s2;
if ( !*str2 )
return((char *)str1);
while (*cp)
{
s1 = cp;
s2 = (char *) str2;
while ( *s1 && *s2 && !(*s1-*s2) )
{
s1++;
s2++;
}
if (!*s2)
return(cp);
cp++;
}
return(NULL);
}
int main()
{
char arr1[] = "abbbcdef";
char arr2[] = "bbc";
char* ret = my_strstr(arr1, arr2);
if(ret == NUll)
{
printf("沒有找到");
}
else
{
printf("%s\n", ret);
}
return 0;
}
9、strtok函式
strtok 函式的引數型別和回傳型別
char * strtok ( char * str, const char * sep );
功能介紹:
- sep引數是個字串,定義了用作分隔符的字符集合
- 第一個引數指定一個字串,它包含了0個或者多個由sep字串中一個或者多個分隔符分割的標記,
- strtok函式找到str中的下一個標記,并將其用 \0 結尾,回傳一個指向這個標記的指標,(注:
strtok函式會改變被操作的字串,所以在使用strtok函式切分的字串一般都是臨時拷貝的內容
并且可修改,) - strtok函式的第一個引數不為 NULL ,函式將找到str中第一個標記,strtok函式將保存它在字串
中的位置, - strtok函式的第一個引數為 NULL ,函式將在同一個字串中被保存的位置開始,查找下一個標
記, - 如果字串中不存在更多的標記,則回傳 NULL 指標,
strtok函式的使用
#include <stdio.h>
int main()
{
char *p = "zhangpengwei@bitedu.tech";
const char* sep = ".@";
char arr[30];
char *str = NULL;
strcpy(arr, p); //將資料拷貝一份,處理arr陣列的內容
for(str=strtok(arr, sep); str != NULL; str=strtok(NULL, sep))
{
printf("%s\n", str);
}
}
10、strerror函式
strerror函式的功能: 回傳錯誤碼所對應的錯誤資訊,
strerror 函式的引數型別和回傳型別
char * strerror ( int errnum );
int errnum —— 表示錯誤碼
C語言中提供了一個變數是用來存放錯誤碼 —— 這個變數是:errno
strerror函式的使用:
#include <stdio.h>
#include <string.h>
#include <errno.h> //必須包含的頭檔案
int main ()
{
FILE * pf;
pf = fopen ("unexist.ent","r"); //用讀的方式來打開檔案,目前沒有這個檔案,所以會顯示錯誤,
if (pf == NULL) //錯誤就會回傳空指標
printf ("%s\n",strerror(errno));
return 0;
}
//運行程式就會列印錯誤資訊
擴展:
perror 和 strerror 的功能相似,
但是perror的功能更加的方便,不用傳errno就能列印錯誤資訊
有興趣的可以上MSDN上搜一個這個庫函式
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/344294.html
標籤:其他
