(eden)合并字符串
题目名称
合并字符串
题目描述
合并两个字符串,每个字符串长度不小于1不超过50,
主函数已经给出,在join.h头文件中完成join函数,函数原型如下:
char* join(char* a, int alength, char* b, int blength)
需要在join函数中动态申请内存,长度为a和b长度之和加1(因为字符串结尾有‘\0’); 函数返回值即所动态申请内存的首地址。
输入:两个字符串,每个一行
输出:合并后的字符串及所申请内存的实际大小,字符串一行,实际大小一行
Sample:
input:
1234
567890
output:
1234567890
24
HINT
使用malloc函数进行动态内存申请,申请到的实际内存大小与操作系统相关,大部分情况下不等于所申请的具体数值。
理解
这一题主要让我们熟悉目前的动态分配函数的相关内容,malloc返回值为分配到内存空间的首地址,所以必须要用地址类型来存储返回值,接着赋值的话,可以多种方法了,可以傻傻地一个一个的赋值也可以利用处理字符串的函数strcpy还有标答中给到的mencpy。
我的代码
1 //“join.h” 2 char* join(char* a, int al, char* b, int bl) { 3 int i; 4 char ch; 5 char* t = malloc((al + bl + 1)* sizeof(ch));//强制类型转换不能够(char*)这样过不了google style有一个什么Using C-style cast. Use reinterpret_cast<char*>然而本地编译器并用不了,还要注意malloc分配空间应该是多少 6 for (i = 0; i < al; i++) { 7 *(t + i) = *(a + i); 8 }//我的是一个一个赋值过去,用memcpy更快 9 for (i = al; i < al + bl; i++) { 10 *(t + i) = *(b + i - al); 11 } 12 *(t + al + bl) = '\0';//注意加'\0'否则输出的时候会死循环或者出现奇怪的数,因为找不到结束 13 return t; 14 }
1 //main.c 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<malloc.h> 6 #include"join.h" 7 #define MAX 51 8 int main() { 9 char a[MAX]; 10 char b[MAX]; 11 char* c = NULL; 12 scanf("%s", a); 13 scanf("%s", b); 14 c = join(a, strlen(a), b, strlen(b));//这个srtlen是不包括\0在内的长度 15 printf("%s\n", c); 16 printf("%d\n", malloc_usable_size(c));//这个本地编译器又没有 17 free(c); 18 return 0; 19 } 20
标程代码
1 #ifndef __JOINS__ 2 #define __JOINS__ 3 #include<stdio.h> 4 #include<stdlib.h> 5 #include<string.h> 6 #include<malloc.h> 7 char* join(char* a, int alength, char* b, int blength) { 8 char* c = malloc(sizeof(a[0]) * (alength + blength + 1)); 9 memcpy(c, a, sizeof(a[0]) * alength); 10 memcpy(c + alength, b, sizeof(b[0]) * blength); 11 c[alength + blength] = '\0'; 12 return c; 13 } 14 #endif
问题
①一个还是自己定义文件的问题,为什么我的里面不用include<malloc>就可以使用include<malloc>等等;
②google style出了两次问题,一个是强制类型转换,用我目前的那个可以通过,但是c = (char*)...不行,然后还有一个新的强制转换类型,没有使用过,另一个就是sizeof()里面必须是变量名,不要加类型;
③遇到了内存错误读写的问题,因为malloc开小了,malloc应该开a的长度加上b的长度(不包括‘\0’)的再加上一个'\0'的长度,其中注意srtlen得到的就是不包括'\0'的,最后记得在c加一个'\0';
④memcpy不会使用
memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中;
函数原型:void *memcpy(void *dest, const void *src, size_t n);
需要头文件#include<string.h>
需要学习的地方
①同上,自己定义文件;
②强制类型转换的那个新类型;
③memcpy以及strlen等各种处理字符函数的使用,还有各种头文件的说明;
④动态内存分配。
(以后这些需要学习的地方要学习,还有问题需要解决,之后总结分成随笔发布)