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 -;
}
/*
src="ddddabcd11111abcd2222abcdqqqqq"
sub="abcd"
new_sub="aaaaaa"
*/ char *start = src;
char *p = NULL;
char tmp[] = { };
int len = ; do {
/*
src="ddddabcd11111abcd2222abcdqqqqq"
sub="abcd"
new_sub="aaaaaa"
*/
p = strstr(start, sub);
if (p != NULL) {
len = ;
len = p - start;
if (len > ) {
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) + );
strcpy(buf, tmp); //间接赋值,是指针存在的最大意义
*dst = buf; return ;
}
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 = ; ret = replaceSubstr(p, &buf, "abcd", "aaaaa");
if (ret != ) {
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 ;
}

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[][], int *count) {
if (str == NULL || count == NULL) {
return -;
}
//str="abcdef,acccd,eeee,aaaa,e3eeee,ssss,"
const char *start = str;
char *p = NULL;
int i = ;
do {
p = strchr(start, c);//strchr在c++中的返回值为const char*
if (p != NULL) {
int len = p - start;
strncpy(buf[i], start, len);
//结束符
buf[i][len] = ; i++; //重新设定起点位置
start = p + ;
}
else {
//printf("strat=%s\n", start);
strcpy(buf[i], start);
i++;
break;
}
} while (*start != ); if (i == ) {
return -;
} *count = i; return ;
}
char **getMem(int n) {
char **buf = NULL;//char *buf[n]
buf = (char**)malloc(n * sizeof(char*));//char*
if (buf == NULL) {
return NULL;
} int i = ;
for (i = ; i < n; i++) {
buf[i] = (char*)malloc();
}
return buf;
} int spitString2(const char *str, char c, char **buf /*in*/, int *count) {
if (str == NULL || count == NULL) {
return -;
}
//str="abcdef,acccd,eeee,aaaa,e3eeee,ssss,"
const char *start = str;
char *p = NULL;
int i = ;
do {
p = strchr(start, c);//strchr在c++中的返回值为const char*
if (p != NULL) {
int len = p - start;
strncpy(buf[i], start, len);
//结束符
buf[i][len] = ; i++; //重新设定起点位置
start = p + ;
}
else {
//printf("strat=%s\n", start);
strcpy(buf[i], start);
i++;
break;
}
} while (*start != ); if (i == ) {
return -;
} *count = i; return ;
return ;
}
int main(){
const char *p = "abcdef,acccd,eeee,aaaa,e3eeee,ssss,";
char **buf = NULL; int n = ;
int i = ;
int ret = ; buf = getMem();
if (buf == NULL) { return -;
} ret = spitString2(p, ',', buf, &n);
if (ret != ) {
printf("spitString err:%d", ret); system("pause");
return ret;
} for (i = ; i < n; i++) {
printf("%s\n", buf[i]);
} for (i = ; i < n; i++) {
free(buf[i]);
buf[i] = NULL;
}
if (buf != NULL) {
free(buf);
buf = NULL;
}
printf("\n");
system("pause");
return ;
}
/*
测试函数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]);
}
*/

c提高第三次作业的更多相关文章

  1. c提高第五次作业

    重写结构体嵌套一级指针老师和二级指针学生的代码 //结构体类型,每个导师有三个学生 typedef struct Teacher { char *tName; //导师 char **stu; //三 ...

  2. c提高第四次作业

    1. 简述指针数组和数组指针的区别?答: 指针数组:是一个数组,每个元素都是指针 数组指针:是一个指针,指向数组的指针 2. 如何定义一个指向 int a[10] 类型的指针变量(数组指针)(使用3种 ...

  3. OO第一单元三次作业总结

    写在前面 第一单元作业是针对输入的多项式进行格式合法判断,然后进行求导,结果长度优化,最后输出.三次难度递增,不断添加新的需求,总体感觉在实现方面没有多大困难(?),个人主要困扰环节是寻找自己未知bu ...

  4. oo前三次作业博客总结

    第一次作业 实现多项式的加减运算,主要问题是解决输入格式的判断问题. 输入实例: {(3,0), (2,2), (12,3)} + {(3,1), (-5,3)} – {(-199,2), (29,3 ...

  5. 耿丹CS16-2班第三次作业汇总

    -- Deadline: 2016-10-12 22:48 -- 作业内容: 1.实验2-6 猜数字游戏 2.实验2-7 判断能否为三角形 3.实验2-8 个人所得税计算器 -- 第三次作业总结: 1 ...

  6. JAVA第三周作业(从键盘输入若干数求和)

    JAVA第三周作业(从键盘输入若干数求和) 在新的一周,我学习了JAVA的IO编程.下面的代码实现了从键盘输入若干数求和的目标.import java.util.Scanner; public cla ...

  7. 第三次作业:caculator

    第三次作业 作业链接 ********* 遇到的问题: Scan类: 队列的使用方法不了解,上网查询并自己练习了一下才初步了解,才运用到作业 . 判断数字用的 if (input[i] >= ' ...

  8. HTML第三天作业做的表格

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  9. 第三次作业——《K米评测》

    第三次作业--<K米评测> 一.调研.评测 上手体验 APP的图标做的不错,一眼就知道和KTV唱歌相关的 点进去就是连接包箱的界面和直播界面,把软件最重要的两个功能展示出来了,一目了然 热 ...

随机推荐

  1. python学习笔记(六)、类

    Python与java.c++等都被视为一种面向对象的语言.通过创建自定义类,用于处理各种业务逻辑.面向对象有封装.继承.多态三个特征,这也是面子对象语言的通用特征. 1 封装 封装,是值向外部隐藏内 ...

  2. 获取 wx.getUserInfo 接口后续将不再出现授权弹窗,请注意升级(微信小程序开发)

    微信小程序开发时,Console 提示:获取 wx.getUserInfo 接口后续将不再出现授权弹窗,请注意升级 错误原因: 直接调用这个方法依旧可以获取用户信息, 但是如果你之前没有点击过那个授权 ...

  3. finereport报表--动态格间运算 一

    一.运算符:   ! 绝对值 A2[A2:!1] ;   A2 标示从列A纵向第2单元格开始,!1 表示第1个位置的单元格; [A2:!1] 代表索引,表示从A列纵向开始往下,第1个单元格的位置的索引 ...

  4. vue + elementUi + upLoadIamge组件 上传文件到阿里云oss

    <template> <div class="upLoadIamge"> <el-upload action="https://jsonpl ...

  5. Python常见的问题

    1. new.init区别,如何实现单例模式,有什么优点 new是一个静态方法,init是一个实例方法new返回一个创建的实例,init什么都不返回new返回一个cls的实例时后面的init才能被调用 ...

  6. 环境设置——pyCharm环境下导入MySQLdb遇到的一系列问题

    本文转自http://blog.sina.com.cn/s/blog_135031dae0102yc8l.html 安装好pyCharm后想要import MySQL,结果发现了一系列问题,像推到了塔 ...

  7. win7 64 位操作系统,进程System,PID为4,扫描连接局域网ip地址的139和445端口

    偶然发现电脑的System进程不间断扫描连接局域网内的其它IP对应的445和139端口,这是个问题. 上网搜索,立即关闭139端口的监听. 方法如下: 本地连接属性-TCP/IP属性-高级-WINS选 ...

  8. C# 不用递归,获取无限层级数据

    对象属性 public class ResList { public int ID { get; set; } public List<ResList> Child { get; set; ...

  9. 宋宝华:关于Ftrace的一个完整案例【转】

    Ftrace简介 Ftrace是Linux进行代码级实践分析最有效的工具之一,比如我们进行一个系统调用,出来的时间过长,我们想知道时间花哪里去了,利用Ftrace就可以追踪到一级级的时间分布. Ftr ...

  10. OV摄像头图像采集基础知识总结

    目前FPGA用于图像采集 传输 处理 显示应用越来越多,主要原因是图像处理领域的火热以及FPGA强大的并行处理能力.本文以OV7725为例,对摄像头使用方面的基础知识做个小的总结,为后续做个铺垫. 下 ...