5.5 拷贝字符,字符串长度、判断某字符串是否是指定字符串的尾部

公式:

  • &arr[i] + j = &arr[i+j]
  • arr+i = (&arr[0])+i = &arr[i]
  • *(arr+i) = *(&arr[i]) = arr[i]

创建长度为 10000 的数组 allocbuf,所有的字符串都在这被分配空间,初始指针 allocp 指向 allocbuf[0]。

需编写方法 alloc 分配空间,参数是字符串长度 n。

假如现在 allocp = &allocbuf[4],要储存长度为 3 的 “abc”。先返回 &allocbuf[4],allocbuf[4] = ‘a’,allocbuf[5] = ‘b’,allocbuf[6] = ‘c’,allocp 很自然的指向 allocbuf[7]。

返回 allocp,并 allocp += n。

最后一个元素的地址 &allocbuf[9999] = &allocbuf[0] + 9999 = allocbuf + 9999。当数组被填满,如 allocbuf[0] = ‘a’, allocbuf[1] = ‘b’, … allocbuf[9999] = ‘z’,allocp = &allocbuf[10000],再也不能分配新的空间。allocp 的范围:&allocbuf[0] ~ &allocbuf[10000]。

allocp + n <= &allocbuf[10000]

&allocbuf[10000] = allocbuf + 10000

#include <stdio.h>
#define ALLOCSIZE 10000
static char allocbuf[ALLOCSIZE];
static char *allocp = allocbuf;

char* alloc(int n) {
    // 如果空间足够
    if (allocp + n <= allocbuf + ALLOCSIZE) {
        char *temp = allocp;
        allocp += n;
        return temp;
    } else {
        printf("空间不足!");
        return 0;
    }
}
void afree(char *p) {
    if (p >= allocbuf && p < allocbuf + ALLOCSIZE) allocp = p;
}
int main() {
	// 返回 &allocbuf[0],allocp = &allocbuf[3]
    char *p = alloc(3);
    *p = 'a';
    *(p+1) = 'b';
    *(p+2) = 'c';
	printf("%s\n", allocbuf);// abc
    
	// 返回 &allocbuf[3],allocp = &allocbuf[5]
    char *p2 = alloc(2);
    p2[0] = 'd';
    p2[1] = 'e';
    printf("%s\n", allocbuf);// abcde
    
	// allocp = &allocbuf[0]
    afree(p);
	
	// 返回 &allocbuf[0],allocp = &allocbuf[1]
	p = alloc(1);
	p[0] = 'z';
    printf("%s\n", allocbuf);// zbcde
}

&arr[j] - &arr[i] = j - i

字符串 “abc”,arr[0] = ‘a’,arr[1] = ‘b’,arr[2] = ‘c’,arr[3] = ‘\0’,字符串长度 &arr[3] - &arr[0] = 3。

int strleng(char *s) {
    // p = &s[0]
    char *p = s;
    while (*p != '\0') {
        p++;
    }
    // 循环结束后,*p = '\0',p = &s[leng]
    return p - s;
}

当拷贝到最后一个字符时,s++、t++,*s = *t = ‘\0’,while (‘\0’) 终止循环。

void strcpy(char *s, char *t) {
    while (*s++ = *t++);
}
int main() {
	int strend(char*, char*);
	char s[] = "abc";
	char t[] = "c";
	printf("%d", strend(s, t));
}
// 如果 t 出现在 s 的尾部,返回 1,否则返回 0
int strend(char *s, char *t) {
	char *p = t;
	// 到达尾部
	while (*s != '\0') {s++;}
	while (*t != '\0') {t++;}
	
    // 从尾部往头比较
	for (; *s == *t; s--, t--) {
		if (t == p) {
			return 1;
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值