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

    题目


    合并两个字符串,每个字符串长度不小于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函数进行动态内存申请,申请到的实际内存大小与操作系统相关,大部分情况下不等于所申请的具体数值。


    //join.h
    #include<stdio.h>
    char* join(char* a, int alength, char* b, int blength) {
      int i;
      char ch;
      char* c = malloc(sizeof(ch) * (alength+blength+1));
      for (i = 0; i < alength; i++)
          c[i] = a[i];
      for (i = alength; i < alength+blength+1; i++)
          c[i] = b[i-alength];
      return c;
    }
    //main.c
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<malloc.h>
    #include"join.h"
    #define MAX 51
    int main() {
        char a[MAX];
        char b[MAX];
        char* c = NULL;
        scanf("%s", a);
        scanf("%s", b);
        c = join(a, strlen(a), b, strlen(b));
        printf("%s
    ", c);
        printf("%d
    ", malloc_usable_size(c));
        free(c);
        return 0;
    }

    笔记:


    1、google style出了两次问题,一个是强制类型转换,c = (char*)...不能通过;还有一个新的强制转换类型,没有使用过,另一个就是sizeof()里面必须是变量名,不要加类型;

    2、malloc分配的内存为alength+blength+1;若输出为字符串数组则不用加'',若为字符,只需令c[alength+blength+1] = ''

    3、strlen得到的值不包括''

    4、有关标准答案的memcpy函数总结

    #ifndef __JOINS__
    #define __JOINS__
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<malloc.h>
    char* join(char* a, int alength, char* b, int blength) {
        char* c = malloc(sizeof(a[0]) * (alength + blength + 1));
        memcpy(c, a, sizeof(a[0]) * alength);
        memcpy(c + alength, b, sizeof(b[0]) * blength);
        c[alength + blength] = '';
        return c;
    }
    #endif

    memcpy函数:c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中,返回dest的值。

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

    所需头文件:#include <string.h>

    具体说明:

    1.source和destin所指的内存区域可以重叠,但是如果source和destin所指的内存区域重叠,那么这个函数并不能够确保source所在重叠区域在拷贝之前被覆盖。而使用memmove可以用来处理重叠区域。函数返回指向destin的指针。

    2.strcpy和memcpy主要有以下3方面的奇。

    2.1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。

    2.2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符""才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。

    2.3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy

    3.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。

    注意:source和destin都不一定是数组,任意的可读写的空间均可。memcpy的实现过程,里面是一个一个字符的赋值的,想连续赋值,就要把指针指向连续的内存的首地址。由于函数拷贝的过程是一个字节一个字节的拷贝的,所以实际操作的时候要把void*强制转化为char*,这样在指针加的时候才会保证每次加一个字节。

    example1

    作用:将s中的字符串复制到字符数组d中。

    // memcpy.c

    #include <stdio.h>

    #include <string.h>

    int main()

    {

    char *s="Golden Global View";

    char d[20];

    clrscr();

    memcpy(d,s,(strlen(s)+1));

    printf("%s",d);

    getchar();

    return 0;

    }

    输出结果:Golden Global View

    example2

    作用:将s中第14个字符开始的4个连续字符复制到d中。(从0开始)

    #include <string.h>

    int main()

    {

    char *s="Golden Global View";

    char d[20];

    memcpy(d,s+14,4); //从第14个字符(V)开始复制,连续复制4个字符(View)

    //memcpy(d,s+14*sizeof(char),4*sizeof(char));也可

    d[4]='';

    printf("%s",d);

    getchar();

    return 0;

    }

    输出结果: View

    example3

    作用:复制后覆盖原有部分数据

    #include <stdio.h>

    #include <string.h>

    int main(void)

    {

    char src[] = "******************************";

    char dest[] = "abcdefghijlkmnopqrstuvwxyz0123as6";

    printf("destination before memcpy: %s ", dest);

    memcpy(dest, src, strlen(src));

    printf("destination after memcpy: %s ", dest);

    return 0;

    }

    输出结果:

    destination before memcpy:abcdefghijlkmnopqrstuvwxyz0123as6

    destination after memcpy: ******************************as6

  • 相关阅读:
    缓存
    mybatis(ibatis)理解
    hibernate理解
    linux vi 命令
    Activity中ConfigChanges属性的用法
    sendStickyBroadcast和sendStickyOrderedBroadcast
    广播 BroadCastReceiver
    Android四大基本组件介绍与生命周期
    ubuntu14.04 开机自动运行应用程序
    Android中BindService方式使用的理解
  • 原文地址:https://www.cnblogs.com/pora/p/5042798.html
Copyright © 2011-2022 走看看