【C語言】模擬實現strcpy strcat strstr strcmp
阿新 • • 發佈:2019-01-07
模擬實現strcpy(字串拷貝)
這道題,是將原字串的內容拷貝到目標字串中去,一個字元一個字元的拷貝直到遇到 ‘\0’ ,將它也拷貝過去後停止。
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<assert.h> void my_strcpy(char*dest, const char*src) { char ret = dest; assert(dest); assert(src); while ((*dest++ = *src++)) { ; } return ret; } int main() { char a[] = "abc"; char b[] = "bcd"; my_strcpy(b,a); printf("%s\n", b); system("pause"); return 0; }
模擬實現strcat (字串連結)
這道題與strcpy相似,不過是先找到目標字串的 ‘\0’ ,然後在其後邊拷貝原字串的內容,直至 ‘\0’ 也拷貝完成則結束。
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<assert.h> void my_strcpy(char*dest, const char*src) { char ret = dest; assert(dest); assert(src); while (*dest) { dest++; } while ((*dest++ = *src++)) { ; } return ret; } int main() { char a[] = "abc"; char b[] = "bcd"; my_strcpy(b, a); printf("%s\n", b); system("pause"); return 0; }
模擬實現strstr(在一個字串中找另一個字串第一次出現的位置)
這道題在一個字串中查詢一個子字串,我們需要不斷地對比查詢,設字串為str,子字串為substr,我們需要將substr中的每一個字元與str中對比查詢。
1.若字元連續相等,並且substr遇到‘\0’,說明已經查詢完成,此時返回起始匹配的字元地址即可
2.若字元連續相等,但是str遇到‘\0’,此時說明把str都查詢完了,但是還是沒有查詢到substr,此時返回空指標即可
3.若匹配中途失敗,則需要把起始位置變為第一個字元匹配的後一個。如在abbbcd中查詢bbc,第一次遇到b時,匹配仍然會失敗,此時令子字串回到起始位置,但是原字串的起始位置變成第二個b的位置即可。
注:用cur記錄str中開始匹配時的字元的地址,若匹配中途失敗,則cur++。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strstr(const char *str, char *substr)
{
assert(str);
const char *s1 = str;
const char *s2 = substr;
const char *cur = str;
while (*cur)
{
s1 = cur;
s2 = substr;
while (*s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
return cur;
if (*s1 == '\0')
return NULL;
cur++;
}
return NULL;
}
int main()
{
char *p = "abcdefg";
char *q = "bcd";
char *ret = my_strstr(p,q);
printf("%s\n", ret);
system("pause");
return 0;
}
模擬實現strcmp(字串比較)
這道題關鍵在於比較的方式,兩個字串是一個個對應字元進行比較的,若相等則返回0,第一個大則返回大於 0 的數字,第二個大則返回小於 0 的數字。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
int my_strcmp(const char* str1, const char *str2)
{
assert(str1);
assert(str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
}
if (*str1 > *str2)
return 1;
else
return -1;//return *str1-*str2;
}
int main()
{
char *p1 = "abcd";
char *p2 = "aaaa";
int ret =my_strcmp(p1, p2);
printf("%d\n\n",ret);
system("pause");
return 0;
}