1.求字符串长度
首先是最经典和最常用的strlen
size_t myStrlen(const char* str) {
assert(str != NULL);
size_t temp_1 = 0;
while (*str != '\0') {
temp_1++;
str++;
}
return temp_1;
}
int main() {
char str[] = "abcdefgh";
char str1[10];
printf("%d", myStrlen(str1));
return 0;
}
2.字符串的复制(strcpy)
char* myStrcpy(char* str, const char* str1) {
assert(str != NULL);
assert(str1 != NULL);
char* p = str1;
while (*str1 != '\0') {
*str = *str1;
str1++;
str++;
}
*str = *str1;
return p;
}
int main() {
char str[10];
char str2[10];
char str1[] = "abcdefg";
myStrcpy(str2, myStrcpy(str, str1));
//myStrcpy(str, str1);
for (int i = 0; i < strlen(str2); i++) {
printf("%c ", *(str2 + i));
}
return 0;
}
3.当内存重复时进行字符串的复制(memmove),现在我们使用的计算机内存几乎不可能重叠,所以这个函数早以没人使用了,但是其中的思想还是可以了解和借鉴的。
void* myMemmove(void* str1, const void* str2, size_t num) {
assert(str1 != NULL);
assert(str2 != NULL);
char* p1 = (char*)str1;
char* p2 = (char*)str2;
if (p1 >= p2 && p1 < (p2 + num)) {
for (int j = num - 1; j >= 0; j--) {
p1[j] = p2[j];
}
}
else {
for (int i = 0; i < num; i++) {
p1[i] = p2[i];
}
}
return p2;
}
int main() {
char str[] = "memmove can be very useful......";
myMemmove(str + 20, str + 15, 11);
puts(str);
return 0;
}
4.内存层面的复制(memcpy),因为是从内存层面上进行复制的,所以无论传入的是什么类型的数据,都可以进行复制。
void* myMemcpy(void* p1, const void* p2, size_t num) {
assert(p1 != NULL);
assert(p2 != NULL);
char* q1 = (char*)p1;
char* q2 = (char*)p2;
for (int i = 0; i < num; i++) {
q1[i] = q2[i];
}
return q2;
}
int main() {
int a[4] = { 1,2,3,4 };
int b[4];
char c[] = "abcdef";
char d[7];
char e[7];
myMemcpy(b, a, 16);
myMemcpy(e, myMemcpy(d,c,7), 7);
puts(d);
puts(e);
for (int i = 0; i < 4; i++) {
printf("%d ", b[i]);
}
return 0;
}
5.寻找到一个字符串在另一个大的字符串中的位置并返回其的地址(strstr)。
char* myStrstr(char* str1, const char* str2) {
assert(str1 != NULL);
assert(str2 != NULL);
char* p1 = str1;
char* p2 = str2;
int i = 0;
int k = 0;
while (p1[i] != '\0') {
if (p1[i] == p2[k]) {
int j = i;
while (1) {
if (p1[j] != p2[k]) {
k = 0;
break;
}
j++;
k++;
if (p2[k] == '\0') {
return &p1[i];
}
}
}
i++;
}
return NULL;
}
int main() {
char str[] = "This is a simple string";
char* pch;
pch = myStrstr(str, "simple");
if (pch != NULL) {
strncpy(pch, "sample", 6);
}
puts(str);
return 0;
}
6.将字符串进行合并,将一个字符串从另一个字符串的’\0‘位置开始进行添加,添加完之后,在最后再加上’\0‘,(strcat)。
char* myStrcat(char* str1, const char* str2) {
assert(str1 != NULL);
assert(str2 != NULL);
char* p1 = (char*)str1;
char* p2 = (char*)str2;
int i = 0;
int j = 0;
while (1) {
if (p1[i] == '\0') {
while (1) {
p1[i] = p2[j];
i++;
j++;
if (p2[j] == '\0') {
p1[i] = p2[j];
break;
}
}
}
if (p2[j] == '\0') {
break;
}
i++;
}
return p1;
}
int main() {
char str[80];
strcpy(str, "these ");
myStrcat(str, "strings ");
myStrcat(str, "are ");
myStrcat(str, "concatenated.");
puts(str);
return 0;
}
7.实现两个字符串的比较,str1小于str2则返回它两相减的负数,str1大于str2则返回它两相减的正数,str1等于str2则返回0,(strcmp)。
int myStrcmp(const char* str1, const char* str2) {
assert(str1 != NULL);
assert(str2 != NULL);
int i = 0;
while (1) {
if (str1[i] == str2[i]) {
i++;
}
if (str1[i] < str2[i]) {
return str1[i] - str2[i];
}
if (str1[i] > str2[i]) {
return str1[i] - str2[i];
}
if (str1[i] == '\0') {
break;
}
if (str2[i] == '\0') {
break;
}
}
if (str1[i] == '\0') {
return str1[i] - str2[i];
}
if (str2[i] == '\0') {
return str1[i] - str2[i];
}
if (str1[i] == str2[i]) {
return 0;
}
}
int main() {
char key[] = "apple";
char buffer[80];
do {
printf("Guess my favorite fruit? ");
(void)scanf("%79s", buffer);
} while (myStrcmp(key, buffer) != 0);
puts("Correct answer!");
return 0;
}