(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等各种处理字符函数的使用,还有各种头文件的说明;

      ④动态内存分配。

(以后这些需要学习的地方要学习,还有问题需要解决,之后总结分成随笔发布)

posted @ 2015-12-11 18:44  小预备  阅读(336)  评论(0编辑  收藏  举报