目錄
長度不受限的字串
strlen
strcpy
strcpy模擬實作
strcat
strcat模擬實作
strcmp
strcmp模擬實作
長度受限的字串函式
strncpy
strncat
strncmp
其他型別的字串函式
strstr
strtok
strerror
長度不受限的字串函式
strlen
size_t strlen(char *str)
#include<string.h>
#include<stdio.h>
//strlen,記到\0為止
int main()
{
char arr[] = "abc";
char arr1[] = { 'a','b','c' };
int len = strlen(arr1);
printf("%d", len);//len是一個亂數,因為一直往后不知道什么時候會找到\0
return 0;
}
strlen 的回傳值為size_t無符號數
#include<stdio.h>
#inlcude<string.h>
int main()
{
if (strlen("abc") - strlen("abcdef") > 0)//3-6=-3,正常情況下是小于0,但無符號數-無符號數=無符號數,因此,-3是一個無符號數,最高位就不認為是符號位了
//是一個非常大的數,1000 0000 0000 0000 0000 0000 0000 0011
// 1111 1111 1111 1111 1111 1111 1111 1101
{
printf(">");
}
else
{
printf("<");
}
printf("%u", strlen("abc") - strlen("abcdef"));//無符號數把補碼最高位1不認為是符號位,列印了出來
return 0;
}
strcpy
strcpy
注意事項
1.源字串必須以\0結束,
2.同時會將字串拷貝到目標空間里面去
3.目標空間必須足夠大,來存放源字串,否者程式就會崩潰
4.目標空間必須可變,源字串必須不可變
4.arr1的字符大于arr2,arr1后面的也會消失
#include<stdio.h>
#inlcude<string.h>
int main()
{
char arr[20] = "#########";
char *p = "abcde";//這是一個常量字串,不可被改變,p指向的是字串首元素地址,h的地址
//arr="hello"這是錯誤的
strcpy(arr, p);//把p里面的內容拷貝到arr里面,同時arr后面內容也會消失,等同于一個p
char arr1[20];
char arr2[20]={'a','b','c'};//沒有遇到\0,會一直找,就是一個隨機值
strcpy(arr1, arr2);
printf("%s\n", arr);
printf("%s", arr1);
return 0;
}
strcpy的模擬實作
#include<stdio.h>
#inlcude<string.h>
char * mystrcpy(char *dest, const char *src)
//const修飾*src的內容就不能改變了,這里可以用char*來接識訓傳值,也可以用void
{
while (*dest++ = *src++)//*dest++到\0的時候就不會繼續回圈了
{
;
}
return *dest;
}
int main()
{
char arr[20] = { 0 };
char* p = "hello world";
mystrcpy(arr, p);
printf("%s", arr);
return 0;
}
strcat
strcat
把源字串接到目標字串的后面
源字串必須以\0結尾
\0會被覆寫
會將源字串的\0拷貝到目標空間里面去
目標空間必須足夠大
目標空間必須可變
#include<stdio.h>
#inlcude<string.h>
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
strcat(arr1, arr2);//把world追加到arr1的后面
printf("%s", arr1);
return 0;
}
#include<stdio.h>
#inlcude<string.h>
int main()
{
char arr[20] = "abcd";
strcat(arr, arr);
printf("%s", arr);//無法在自己的后面追加自己,\0被覆寫了,不斷重復的追加,找不到結束的\0了
return 0;
}
模擬實作strcat
#include<stdio.h>
#inlcude<string.h>
char * mystrcat(char *dest, char *src)
{
while (*dest)
{
dest++ ;
}//首先要先讓dest指向\0處,指向\0為0就是假就不會繼續回圈了
//arr1拷貝到arr里面去
while (*dest++ = *src++)
{
;
}
return *dest;
}
int main()
{
char arr[20] = " hacb ";
char arr1[] = "world";
mystrcat(arr, arr1);
printf("%s", arr);
return 0;
}
strcmp
#include<stdio.h>
#inlcude<string.h>
int main()
{
char* p = "abcd";
char *q = "abcdef";
if (p > q)//p和q比的地址
{
printf(">");
}
else
{
printf("<");
}
if("anc">"cbcd")//運算式分別是a和c的地址
int ret = strcmp("abbb", "abf");//b<c,回傳<0
printf("%d", ret);//
return 0;
}
模擬實作strcmp
strcmp字串比較函式
比較的是字串的大小,(ascll)
int strcmp(const char *p1,const char *p2)
如果p1的那個字符大于p2的那個字符,就會回傳>0,從左到右比較
#include<stdio.h>
#inlcude<string.h>
#include<assert.h>
int mystrcmp(const char*s1, const char *s2)
{
assert(s1&&s2);//斷言s1,s2不是空指標
while (*s1 == *s2)
{
if (*s1 == '\0'||*s2=='\0')//當發現其中有一個等于\0就回傳0
{
return 0;
}
s1++;
s2++;
}
if (*s1 > *s2)
{
return 1;
}
else
{
return -1;
}
return *s1 - *s2;
}
int main()
{
char *p = "abcdef";
char *q = "abbb";
int ret = mystrcmp(p, q);
printf("%d", ret);
return 0;
}
長度受限的字串函式
strncpy
#include<stdio.h>
#inlcude<string.h>
int main()
{
char arr1[20] = "abcdef";
char arr2[] = "qwer";
//strncpy(arr1, arr2, 2);//把arr2的前兩個拷貝到arr1里面//qwcdef
//strcpy(arr1, arr2);
strncpy(arr1, arr2, 6);//arr2拷貝過去\0也會被拷貝過去,arr2的字符小于6,但也只會拷貝arr2所有元素加\0
printf("%s", arr1);
return 0;
}
strncat
#include<stdio.h>
#inlcude<string.h>
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
//strncat(arr1, arr2, 2);//在arr后面2個元素
strncat(arr1, arr2, 10);//hello world\0,即使數多余arr2,也只會追加一個
printf("%s", arr1);
return 0;
}
strncmp
#include<stdio.h>
#inlcude<string.h>
int main()
{
char *p = "abcdef";
char *q = "abcqwert";
int ret = strncmp(p, q, 4);//選前四個進行一一比較
printf("%d", ret);
return 0;
}
其他的一些字串函式
strstr
char *strstr(const char *str1,const char* str2)
如果找到了就會回傳str2在str1中首地址,否則回傳空指標
#include<stdio.h>
#inlcude<string.h>
int main()
{
char arr1[] = "abcdefabcdef";
char arr2[] = "bcd";
char *ret = strstr(arr1, arr2);
if (ret == NULL)
{
printf("找不到");
}
else
{
printf("找到了");
}
return 0;
}
模擬實作strstr
#include<assert.h>
#include<stdio.h>
#inlcude<string.h>
char *mystrstr(const char *str1, const char *str2)
{
assert(str1&&str2);
const char *s1 = NULL;//s1來移動判斷是否有和str2有相同元素
const char *s2 = NULL;//s2如果能走到\0就找到了
char *cp = str1;//cp來記錄如果s1走下去沒有,cp就往下走一位
while (*cp)
{
s1 = cp;//s1從cp的位置的位置開始走
s2 = str2;//s2從str2的首元素位置開始走
while (*s1&&*s2 && (*s1 == *s2))//*s1走到\0或者*s2走到\0就不繼續回圈了,
{
//*s1和*s2相等的話,就開始回圈,回圈到*s1或者*s其中一方到\0就跳出回圈
s1++;
s2++;
}
if (*s2 == '\0')//如果*s到達\0,就代表找到了,
{
return cp;
}
cp++;
}
return NULL;
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "cde";
char *ret = mystrstr(arr1, arr2);
if (ret == NULL)
{
printf("找不到");
}
else
{
printf("找到");
}
return 0;
}
strtok
strtok(char *str,const char*sep)
1990.02.19//..就是分隔符號的集合
sep引數是一個字串,定義了用作分隔符的字符集合
第一個引數指定一個字串,他包含了0個或者多個由sep字串中一個或者多個分隔符分割的標記
strtok函式找到str中的下一個標記,并將其用\0結尾,回傳一個指向這個標記的指標首元素地址,
strtok函式的第一個引數部位NULL,函式找到str中第一個標記,strtok函式保存他在字串中的位置
strtok函式第一個引數為NULL,函式將同一個字串被保存的位置開始,查找下一個標記,
如果不存在更多的標記,則回傳NULL指標
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "1990.02.20";
char *p = "..";
char tmp[20] = { 0 };
strcpy(tmp, arr);//tmp中拷貝了arr的元素
char* ret = NULL;//在沒有考慮好要賦什么值的時候將其置為空指標
ret=strtok(tmp, p);//tmp到第一個分隔符停止補上\0
printf("%s\n", ret);
ret = strtok(NULL, p);//此后每次使用第一個位置都是NULL
printf("%s\n", ret);
ret = strtok(NULL, p);
printf("%s", ret);
return 0;
}
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "1990.02.20";
char *p = "..";
char tmp[20] = { 0 };
strcpy(tmp, arr);
char *ret = NULL;
for (ret = strtok(tmp, p); ret != NULL; ret = strtok(NULL, p))//ret比到最后就變成空指標,不是空指標就不會繼續回圈
{
printf("%s\n",ret);
}
return 0;
}
strerror
strerror//把錯誤碼翻譯成對應的錯誤資訊
char *strerror(int errnum)
errno是一個全域的錯誤碼
要包含頭檔案
#include<>
使用庫函式的時候,有可能會呼叫庫函式失敗的時候,都會設定一個錯誤碼, int errno
#include<stdio.h>
int main()
{
printf("%s\n", strerror(0));
printf("%s\n", strerror(1));
printf("%s\n", strerror(2));
printf("%s\n", strerror(3));
printf("%s\n", strerror(4));
printf("%s\n", strerror(5));
FILE * pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("%s",strerror(errno));
return 1;
}
fclose(pf);
pf = NULL;
return 0;
}
只會我會將代碼上傳到我的gitee倉庫上
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/342267.html
標籤:其他
上一篇:演算法開啟小碼農堆疊血脈
