Ranbo_ 发表于 2020-2-26 13:08:18

不借用字符串库函数连接字符串

本帖最后由 Ranbo_ 于 2020-2-26 13:17 编辑

1.不借用任何字符串库函数实现接受两个字符串,然后把它们连接起来并输出。
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char str1 = {0}, str2 = {0};//输入两个字符串,初始化
    char lj = {0};//连接两个字符串,初始化
    while(scanf("%s %s", str1, str2) != EOF)
    {
      int i = 0, j = 0;//i用于str1的复制。并记录str1的长度,j用于继续复制str2
      while(str1 != '\0')
      {
            lj = str1;
            i++;
      }//结束时将str1完整复制到了lj里,i = strlen(str1)
      while(str2 != '\0')
      {
            lj = str2;
            i++;    j++;
      }
      
      printf("%s\n",lj);
    }
   
    return 0;
}

2.不借用任何字符串库函数实现无冗余地接受两个字符串,然后把它们无冗余的连接起来并输出。
#include <stdio.h>
#include <stdlib.h>

/**
*如果要无冗余,就不能使用数组,需要动态分配内存空间
*/
int main()
{
    char *p;//p接受字符串的单个字符
    p = (char *) malloc(sizeof(char));
    while((*p = getchar()) != ' ')
    {
      putchar(*p);
    }//遇到空格退出循环
    while((*p = getchar()) == ' ');//若继续输入空格则一直循环直到输入非空格字符
    putchar(*p);//若p不为空格,此时已经接收了一个第二个字符串的非空格字符,先将其输出
    while((*p = getchar()) != '\n')
    {
      putchar(*p);
    }//继续输出第二个字符串的剩下字符直到输入换行符
    free(p);
}
或者将两个字符串直接连接:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i = 1, j = 1, k;
    char * p1 = (char *)malloc(sizeof(char));
    char * p2 = (char *)malloc(sizeof(char));
    char p;
    while((p = getchar()) != ' ')
    {
      p1 = (char *)realloc(p1, sizeof(char) * i);//预留一个空间放结束符
      *(p1 + i - 1) = p;
      i++;
    }//输入啥都给p1,直到遇到空格
    p1 = (char *)realloc(p1, sizeof(char) * i);
    *(p1 + i - 1) = '\0';//p1最后一个字符置为'\0'
   
    while((p = getchar()) == ' ');//若继续输入空格则一直循环直到输入非空格字符
    p2 = (char *)realloc(p2, sizeof(char));
    *p2 = p;
    while((p = getchar()) != '\n')
    {
      p2 = (char *)realloc(p2, sizeof(char) * (j + 1));//p2已经有一个字符放进去了,并需要预留一个空间放结束符
      *(p2 + j) = p;
      j++;
    }
    p2 = (char *)realloc(p2, sizeof(char) * (j + 1));
    *(p2 + j) = '\0';                                                   //p2最后一个字符置为'\0'
    p1 = (char *)realloc(p1,sizeof(char) * (i + j + 1));
    for(k = 0; k < j + 1; k++, i++)
    {
      *(p1 + i - 1) = *(p2 + k);
    }//将p2的字符串复制到p1里,覆盖p1的'\0'
    printf("%s", p1);
    free(p1);
    free(p2);
    return 0;
}

/*如果默认只有一个空格,那么不需要判断多空格的情况,这个时候稍微改一下j的值可以稍微简化一下程序*/


如果默认两个字符串之间只有一个空格:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i = 1, j = 1, k;
    char * p1 = (char *)malloc(sizeof(char));
    char * p2 = (char *)malloc(sizeof(char));
    char p;
    while((p = getchar()) != ' ')
    {
      p1 = (char *)realloc(p1, sizeof(char) * i);//预留一个空间放结束符
      *(p1 + i - 1) = p;
      i++;
    }//输入啥都给p1,直到遇到空格
    p1 = (char *)realloc(p1, sizeof(char) * i);
    *(p1 + i - 1) = '\0';//p1最后一个字符置为'\0'
   
    while((p = getchar()) != '\n')
    {
      p2 = (char *)realloc(p2, sizeof(char) * (j + 1));//p2已经有一个字符放进去了,并需要预留一个空间放结束符
      *(p2 + j) = p;
      j++;
    }
    p2 = (char *)realloc(p2, sizeof(char) * j);
    *(p2 + j - 1) = '\0';                                                   //p2最后一个字符置为'\0'
    p1 = (char *)realloc(p1,sizeof(char) * (i + j - 1));
    for(k = 0; k < j ; k++, i++)
    {
      *(p1 + i - 1) = *(p2 + k);
    }//将p2的字符串复制到p1里,覆盖p1的'\0'
    printf("%s", p1);
    free(p1);
    free(p2);
    return 0;
}


页: [1]
查看完整版本: 不借用字符串库函数连接字符串