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

          ④动态内存分配。

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

  • 相关阅读:
    我的游戏学习日志54———类型游戏策划(1)—动作游戏(1)
    我的游戏学习日志53——游戏游戏策划—小结
    IE8下Extjs报缺少':'符号错误
    Extjs 兼容IE8常见问题及解决方法
    程序员如何提升自己
    extjs layout 最灵活的页面布局样式
    如何运用军事战略建立更好的习惯
    Ext之页面多次请求问题 (下拉框发送无关请求)
    计算机网络通信那些事
    Java基础
  • 原文地址:https://www.cnblogs.com/iamxiaoyubei/p/5039980.html
Copyright © 2011-2022 走看看