字符串處理函數分類
- 求字符串長度:strlen
- 長度不受限制的字符串函數:strcpy,strcat,strcmp
- 長度受限制的字符串函數:strncpy,strncat,strncmp
- 字符串查找:strstr,strtok
- 錯誤信息報告:strerror
- 字符操作,內存操作函數:memcpy,memmove,memset,memcmp
strlen
這是一個用于計算字符串長度的函數,它從字符串的起始位置開始計數,直到遇到字符串結束符\0
為止,然后返回計數器的值。這個函數不包括結束符\0
在內
strlen函數的特點
- 字符串以‘\0’作為結束標志,strlen函數返回的是字符串中‘\0’前面出現的字符個數
strlen函數的模擬實現
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include <assert.h>
#include<string.h>int my_strlen1(const char* str)
{assert(str != NULL);int count = 0;while (*str != '\0'){count++;str++;}return count;
}//遞歸
int my_strlen2(const char* str)
{assert(str != NULL);if (*str != '\0')return 1 + my_strlen2(str + 1);elsereturn 0;
}//指針-指針
int my_strlen3(const char* str)
{const char* start = str;while (*str){str++;}return str - start;
}int main()
{char arr[] = "abcdef";int ret1 = my_strlen1(arr);int ret2 = my_strlen2(arr);int ret3 = my_strlen3(arr);printf("%d\n", ret1);printf("%d\n", ret2);printf("%d\n", ret3);return 0;
}
strlen函數的使用
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<string.h>int main()
{char arr[] = "bdeuwbfuycgbei";int ret = strlen(arr);printf("%d", ret);return 0;
}
輸出結果:
strcpy
這個函數用于將一個字符串復制到另一個字符串中,直到遇到源字符串的結束符\0為止。如果目標字符串已經有內容,會被源字符串覆蓋
strcpy函數的特點
- 源字符串必須以 '\0' 結束
- 會將源字符串中的 '\0' 拷貝到目標空間
- 目標空間必須足夠大,以確保能存放源字符串
- 目標空間必須可變
strcpy函數的模擬實現
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<string.h>
#include<assert.h>char* my_strcpy(char* din, char* sou)
{char* ret = din;assert(din && sou);while ( *din++=*sou++ ){;}return ret;
}int main()
{char str1[20] = "hello ";char str2[] = "hehe";my_strcpy(str2, str1);printf("%s\n", str2);return 0;
}
輸出結果:
strcpy函數的使用
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<string.h>int main()
{char arr1[] = "hello";char arr2[] = "xixi";strcpy(arr1, arr2);printf("%s", arr1);return 0;
}
strcat
這個函數用于將一個字符串追加到另一個字符串的末尾,形成一個新的字符串。它會將源字符串的內容添加到目標字符串的后面,直到遇到源字符串的結束符\0為止
strcat函數的特點
- 源字符串必須以 '\0' 結束。
- 目標空間必須有足夠的大,能容納下源字符串的內容。
- 目標空間必須可修改
strcat函數的模擬實現
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<string.h>
#include<assert.h>char* my_strcat(char* din, char* sou)
{assert(din && sou);char* ret = din;while (*din){din++;}while (*din++ = *sou++){;}return ret;
}int main()
{char arr1[] = "hello ";char arr2[] = "world";my_strcat(arr1, arr2);printf("%s\n", arr1);return 0;
}
strcat函數的使用
#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>
#include <string.h>int main ()
{char key[] = "apple";char buffer[80];do {printf ("Guess my favorite fruit? ");fflush (stdout);scanf ("%79s",buffer);} while (strcmp (key,buffer) != 0);puts ("Correct answer!");return 0;
}#include<stdio.h>
#include<string.h>int main()
{char str[80];strcpy(str, "these ");strcat(str, "strings ");strcat(str, "are ");strcat(str, "concatenated.");puts(str);return 0;
}
輸出結果:
strcmp
這個函數用于比較兩個字符串。如果兩個字符串相等,它返回0;如果第一個字符串小于第二個字符串,它返回負數;如果第一個字符串大于第二個字符串,它返回正數
strcmp函數的規定
strcmp函數的模擬實現
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<string.h>
#include<assert.h>int my_strcmp(const char* arr1, const char* arr2)
{assert(arr1 && arr2);while (*arr1 == *arr2){if (*arr1 == '\0')return 0;*arr1++;*arr2++;}return *arr1 - *arr2;
}int main()
{char arr1[] = "abc";char arr2[] = "abcde";int ret = my_strcmp(arr1, arr2);printf("%d\n", ret);return 0;
}
strcmp函數的使用
#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>
#include <string.h>int main()
{char key[] = "apple";char buffer[80];do {printf("Guess my favorite fruit? ");fflush(stdout);scanf("%79s", buffer);} while (strcmp(key, buffer) != 0);puts("Correct answer!");return 0;
}
輸出結果:
strcpy,strcat,strcmp與strncpy,strncat,strncmp的區別
長度限制方面
strcpy
、strcat
、strcmp
:屬于長度不受限制的字符串函數,以'\0'
作為操作結束標志。例如strcpy
會將源字符串一直拷貝到'\0'
才停止,strcat
會將源字符串追加到目標字符串后直到源字符串的'\0'
,strcmp
會比較兩個字符串直到遇到'\0'
。不過這也可能帶來問題,如strcpy
在目的空間不夠時,由于拷貝到'\0'
才停止,可能會導致越界訪問,使函數變得不安全 。strncpy
、strncat
、strncmp
:屬于長度受限制的字符串函數,在函數調用時需要額外指定操作的字符數量,能避免因操作過長字符串而引發的安全問題
?
#define _CRT_SECURE_NO_WARNINGS 1
/* strncpy example */
#include <stdio.h>
#include <string.h>int main()
{char str1[] = "To be or not to be";char str2[40];char str3[40];/* copy to sized buffer (overflow safe): */strncpy(str2, str1, sizeof(str2));/* partial copy (only 5 chars): */strncpy(str3, str2, 5);str3[5] = '\0'; /* null character manually added */puts(str1);puts(str2);puts(str3);return 0;
}
輸出結果:
其他兩個相似