鱼C论坛

 找回密码
 立即注册
查看: 1211|回复: 0

[技术交流] 不借用字符串库函数连接字符串

[复制链接]
发表于 2020-2-26 13:08:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

  3. int main()
  4. {
  5.     char str1[110] = {0}, str2[110] = {0};//输入两个字符串,初始化
  6.     char lj[250] = {0};//连接两个字符串,初始化
  7.     while(scanf("%s %s", str1, str2) != EOF)
  8.     {
  9.         int i = 0, j = 0;//i用于str1的复制。并记录str1的长度,j用于继续复制str2
  10.         while(str1[i] != '\0')
  11.         {
  12.             lj[i] = str1[i];
  13.             i++;
  14.         }//结束时将str1完整复制到了lj里,i = strlen(str1)
  15.         while(str2[j] != '\0')
  16.         {
  17.             lj[i] = str2[j];
  18.             i++;    j++;
  19.         }
  20.         
  21.         printf("%s\n",lj);
  22.     }
  23.    
  24.     return 0;
  25. }
复制代码


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

  3. /**
  4. *如果要无冗余,就不能使用数组,需要动态分配内存空间
  5. */
  6. int main()
  7. {
  8.     char *p;//p接受字符串的单个字符
  9.     p = (char *) malloc(sizeof(char));
  10.     while((*p = getchar()) != ' ')
  11.     {
  12.         putchar(*p);
  13.     }//遇到空格退出循环
  14.     while((*p = getchar()) == ' ');//若继续输入空格则一直循环直到输入非空格字符
  15.     putchar(*p);//若p不为空格,此时已经接收了一个第二个字符串的非空格字符,先将其输出
  16.     while((*p = getchar()) != '\n')
  17.     {
  18.         putchar(*p);
  19.     }//继续输出第二个字符串的剩下字符直到输入换行符
  20.     free(p);
  21. }
复制代码
或者将两个字符串直接连接:
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main()
  4. {
  5.     int i = 1, j = 1, k;
  6.     char * p1 = (char *)malloc(sizeof(char));
  7.     char * p2 = (char *)malloc(sizeof(char));
  8.     char p;
  9.     while((p = getchar()) != ' ')
  10.     {
  11.         p1 = (char *)realloc(p1, sizeof(char) * i);//预留一个空间放结束符
  12.         *(p1 + i - 1) = p;
  13.         i++;
  14.     }//输入啥都给p1,直到遇到空格
  15.     p1 = (char *)realloc(p1, sizeof(char) * i);
  16.     *(p1 + i - 1) = '\0';//p1最后一个字符置为'\0'
  17.    
  18.     while((p = getchar()) == ' ');//若继续输入空格则一直循环直到输入非空格字符
  19.     p2 = (char *)realloc(p2, sizeof(char));
  20.     *p2 = p;
  21.     while((p = getchar()) != '\n')
  22.     {
  23.         p2 = (char *)realloc(p2, sizeof(char) * (j + 1));//p2已经有一个字符放进去了,并需要预留一个空间放结束符
  24.         *(p2 + j) = p;
  25.         j++;
  26.     }
  27.     p2 = (char *)realloc(p2, sizeof(char) * (j + 1));
  28.     *(p2 + j) = '\0';                                                   //p2最后一个字符置为'\0'
  29.     p1 = (char *)realloc(p1,sizeof(char) * (i + j + 1));
  30.     for(k = 0; k < j + 1; k++, i++)
  31.     {
  32.         *(p1 + i - 1) = *(p2 + k);
  33.     }//将p2的字符串复制到p1里,覆盖p1的'\0'
  34.     printf("%s", p1);
  35.     free(p1);
  36.     free(p2);
  37.     return 0;
  38. }

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


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

  3. int main()
  4. {
  5.     int i = 1, j = 1, k;
  6.     char * p1 = (char *)malloc(sizeof(char));
  7.     char * p2 = (char *)malloc(sizeof(char));
  8.     char p;
  9.     while((p = getchar()) != ' ')
  10.     {
  11.         p1 = (char *)realloc(p1, sizeof(char) * i);//预留一个空间放结束符
  12.         *(p1 + i - 1) = p;
  13.         i++;
  14.     }//输入啥都给p1,直到遇到空格
  15.     p1 = (char *)realloc(p1, sizeof(char) * i);
  16.     *(p1 + i - 1) = '\0';//p1最后一个字符置为'\0'
  17.    
  18.     while((p = getchar()) != '\n')
  19.     {
  20.         p2 = (char *)realloc(p2, sizeof(char) * (j + 1));//p2已经有一个字符放进去了,并需要预留一个空间放结束符
  21.         *(p2 + j) = p;
  22.         j++;
  23.     }
  24.     p2 = (char *)realloc(p2, sizeof(char) * j);
  25.     *(p2 + j - 1) = '\0';                                                   //p2最后一个字符置为'\0'
  26.     p1 = (char *)realloc(p1,sizeof(char) * (i + j - 1));
  27.     for(k = 0; k < j ; k++, i++)
  28.     {
  29.         *(p1 + i - 1) = *(p2 + k);
  30.     }//将p2的字符串复制到p1里,覆盖p1的'\0'
  31.     printf("%s", p1);
  32.     free(p1);
  33.     free(p2);
  34.     return 0;
  35. }
复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-26 11:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表