zoukankan      html  css  js  c++  java
  • (eden)合并字符串

    题目名称

    合并字符串

    题目描述

    合并两个字符串,每个字符串长度不小于1不超过50,

    主函数已经给出,在join.h头文件中完成join函数,函数原型如下:

    char* join(char* a, int alength, char* b, int blength)

    需要在join函数中动态申请内存,长度为a和b长度之和加1(因为字符串结尾有‘’); 函数返回值即所动态申请内存的首地址。

    输入:两个字符串,每个一行

    输出:合并后的字符串及所申请内存的实际大小,字符串一行,实际大小一行

    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) = '';//注意加''否则输出的时候会死循环或者出现奇怪的数,因为找不到结束
    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是不包括在内的长度
    15     printf("%s
    ", c);
    16     printf("%d
    ", 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] = '';
    12     return c;
    13 }
    14 #endif

    问题

          ①一个还是自己定义文件的问题,为什么我的里面不用include<malloc>就可以使用include<malloc>等等;

          ②google style出了两次问题,一个是强制类型转换,用我目前的那个可以通过,但是c = (char*)...不行,然后还有一个新的强制转换类型,没有使用过,另一个就是sizeof()里面必须是变量名,不要加类型;

          ③遇到了内存错误读写的问题,因为malloc开小了,malloc应该开a的长度加上b的长度(不包括‘’)的再加上一个''的长度,其中注意srtlen得到的就是不包括''的,最后记得在c加一个'';

          ④memcpy不会使用

          memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中;

          函数原型:void *memcpy(void *dest, const void *src, size_t n);

          需要头文件#include<string.h>

    需要学习的地方

          ①同上,自己定义文件;

          ②强制类型转换的那个新类型;

          ③memcpy以及strlen等各种处理字符函数的使用,还有各种头文件的说明;

          ④动态内存分配。

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

  • 相关阅读:
    BZOJ 1040 (ZJOI 2008) 骑士
    BZOJ 1037 (ZJOI 2008) 生日聚会
    ZJOI 2006 物流运输 bzoj1003
    ZJOI 2006 物流运输 bzoj1003
    NOI2001 炮兵阵地 洛谷2704
    NOI2001 炮兵阵地 洛谷2704
    JLOI 2013 卡牌游戏 bzoj3191
    JLOI 2013 卡牌游戏 bzoj3191
    Noip 2012 day2t1 同余方程
    bzoj 1191 [HNOI2006]超级英雄Hero——二分图匹配
  • 原文地址:https://www.cnblogs.com/iamxiaoyubei/p/5039980.html
Copyright © 2011-2022 走看看