c提高第三次作业
1. char buf[] = "abcdef";
//下面有啥区别?
const char *p = buf; //p指向的内存不能变
char const *p = buf; //p指向的内存不能变
char * const p = buf; //p的地址不能变
const char *const *p = buf; //p的地址和指向的内存都不能改变
2. char *p1[] = {"1111", "2222", "3333"};
sizeof(p1)/sizeof(p1[0]) = ?
//结果是3
char *p2[10] = {"1111", "2222", "3333"};
sizeof(p2)/sizeof(p2[0]) = ?
//10
char p3[][30] = {"1111", "2222", "3333"};
sizeof(p3)/sizeof(p3[0]) = ?
//3
char p4[10][30] = {"1111", "2222", "3333"};
sizeof(p4)/sizeof(p4[0]) = ?
//10
3. char buf[][30] = {"1111", "2222", "3333"};
二维数组做函数参数,为什么不能这么写?
void fun(char **buf);
void fun(char **buf) 和 void fun(char buf[][30]) 有什么区别?
步长不一样,buf[][30]指定了+1 时候的步长30
4. 画出三种二级指针内存模型图
mian()
{
//指针数组
char *p1[] = {"123", "456", "789"};
//二维数组
char p2[3][4] = {"123", "456", "789"};
//手工二维内存
char **p3 = (char **)malloc(3 * sizeof(char *)); //char *array[3];
int i = 0;
for (i=0; i<3; i++)
{
p3[i] = (char *)malloc(10*sizeof(char)); //char buf[10]
sprintf(p3[i], "%d%d%d", i, i, i);
}
}
5. 有字符串有以下特征(“abcd11111abcd2222abcdqqqqq”),求写一个函数接口,输出以下结果。
把字符串替换成(dcba11111dcba2222dcbaqqqqq),并把结果传出。
要求:
1. 正确实现接口和功能
2. 编写测试用例
/*
src: 原字符串
dst: 生成的或需要填充的字符串
sub: 需要查找的子字符串
new_sub:提换的新子字符串
return : 0 成功
-1 失败
*/
int replaceSubstr(/* in */char *src, /* out */char** dst,
/* in */char *sub, /* in */char *new_sub);
#pragma warning(disable:4996) #include<stdio.h> #include<stdlib.h> #include<string.h> #pragma disable /* 有字符串有以下特征(“abcd11111abcd2222abcdqqqqq”), 求写一个函数接口,输出以下结果。 把字符串替换成(dcba11111dcba2222dcbaqqqqq),并把结果传出。 要求: 1. 正确实现接口和功能 2. 编写测试用例 src: 原字符串 dst: 生成的或需要填充的字符串 sub: 需要查找的子字符串 new_sub:提换的新子字符串 return : 0 成功 -1 失败 */ int replaceSubstr(/* in */char *src, /* out */char** dst, /* in */char *sub, /* in */char *new_sub) { if (src == NULL || dst == NULL|| sub == NULL || new_sub == NULL) { return -1; } /* src="ddddabcd11111abcd2222abcdqqqqq" sub="abcd" new_sub="aaaaaa" */ char *start = src; char *p = NULL; char tmp[512] = { 0 }; int len = 0; do { /* src="ddddabcd11111abcd2222abcdqqqqq" sub="abcd" new_sub="aaaaaa" */ p = strstr(start, sub); if (p != NULL) { len = 0; len = p - start; if (len > 0) { strncat(tmp, start, len); //tmp="dddd" } strncat(tmp, new_sub, strlen(new_sub)); //tmp="ddddaaaaa" //重新设置起点位置 start = p + strlen(sub); } else { strcat(tmp, start); break; } } while (*start != '\0');//strrt[i]!=0 char *buf = (char*)malloc(strlen(tmp) + 1); strcpy(buf, tmp); //间接赋值,是指针存在的最大意义 *dst = buf; return 0; } void freeBuf(char *buf) { if (buf != NULL) { free(buf); buf = NULL; } } void freeBuf1(char **buf) { char *tmp = *buf; //tmp是指向堆区的指针 if (tmp != NULL) { free(tmp); } *buf = NULL; } int main() { char *p = "dddabcd11111abcd2222abcdqqqqq"; char *buf = NULL;//在哪replaceSubstr函数中分配空间 int ret = 0; ret = replaceSubstr(p, &buf, "abcd", "aaaaa"); if (ret != 0) { printf("replaceSubstr err:%d\n", ret); system("pause"); return ret; } printf("p=%s\n", p); printf("buf=%s\n", buf); /* if (buf != NULL) { free(buf); buf = NULL; } */ freeBuf(buf); //freeBuf1(&buf); printf("\n"); system("pause"); return 0; }
6. 有一个字符串符合以下特征(“abcdef,acccd,eeee,aaaa,e3eeee,ssss,”)
写两个函数(API),输出以下结果
第一个API(第二种内存模型)
1)以逗号分隔字符串,形成二维数组,并把结果传出
2)把二维数组行数运算结果也传出
int spitString(const char *str, char c, char buf[10][30], int *count);
第二个API(第三种内存模型)
1)以逗号分隔字符串,形成一个二级指针。
2)把一共拆分多少行字符串个数传出
int spitString2(const char *str, char c, char **myp /*in*/, int *count);
要求:
1, 能正确表达功能的要求,定义出接口。
2, 正确实现接口和功能.
3, 编写正确的测试用例.
#pragma warning(disable:4996) #include<stdio.h> #include<stdlib.h> #include<string.h> //有一个字符串符合以下特征(“abcdef,acccd,eeee,aaaa,e3eeee,ssss,”) int spitString(const char *str, char c, char buf[10][30], int *count) { if (str == NULL || count == NULL) { return -1; } //str="abcdef,acccd,eeee,aaaa,e3eeee,ssss," const char *start = str; char *p = NULL; int i = 0; do { p = strchr(start, c);//strchr在c++中的返回值为const char* if (p != NULL) { int len = p - start; strncpy(buf[i], start, len); //结束符 buf[i][len] = 0; i++; //重新设定起点位置 start = p + 1; } else { //printf("strat=%s\n", start); strcpy(buf[i], start); i++; break; } } while (*start != 0); if (i == 0) { return -2; } *count = i; return 0; } char **getMem(int n) { char **buf = NULL;//char *buf[n] buf = (char**)malloc(n * sizeof(char*));//char* if (buf == NULL) { return NULL; } int i = 0; for (i = 0; i < n; i++) { buf[i] = (char*)malloc(30); } return buf; } int spitString2(const char *str, char c, char **buf /*in*/, int *count) { if (str == NULL || count == NULL) { return -1; } //str="abcdef,acccd,eeee,aaaa,e3eeee,ssss," const char *start = str; char *p = NULL; int i = 0; do { p = strchr(start, c);//strchr在c++中的返回值为const char* if (p != NULL) { int len = p - start; strncpy(buf[i], start, len); //结束符 buf[i][len] = 0; i++; //重新设定起点位置 start = p + 1; } else { //printf("strat=%s\n", start); strcpy(buf[i], start); i++; break; } } while (*start != 0); if (i == 0) { return -2; } *count = i; return 0; return 0; } int main(){ const char *p = "abcdef,acccd,eeee,aaaa,e3eeee,ssss,"; char **buf = NULL; int n = 0; int i = 0; int ret = 0; buf = getMem(6); if (buf == NULL) { return -1; } ret = spitString2(p, ',', buf, &n); if (ret != 0) { printf("spitString err:%d", ret); system("pause"); return ret; } for (i = 0; i < n; i++) { printf("%s\n", buf[i]); } for (i = 0; i < n; i++) { free(buf[i]); buf[i] = NULL; } if (buf != NULL) { free(buf); buf = NULL; } printf("\n"); system("pause"); return 0; } /* 测试函数1 const char *p = "abcdef,acccd,eeee,aaaa,e3eeee,ssss,"; char buf[10][30] = { 0 }; int n = 0; int i = 0; int ret = 0; ret = spitString(p, ',', buf, &n); if (ret != 0) { printf("spitString err:%d", ret); system("pause"); return ret; } for (i = 0; i < n; i++) { printf("%s\n", buf[i]); } */