串的定长表示

举报
兔老大 发表于 2021/04/26 00:22:09 2021/04/26
【摘要】 思想和代码都不难,和线性表也差不多,串本来就是数据受限的线性表。 串连接:   #include <stdio.h>#include <string.h>//串的定长顺序存储表示#define MAXSTRLEN 255 //用户可在255以内定义最大串长typedef unsigned char SString[MAXSTRL...

思想和代码都不难,和线性表也差不多,串本来就是数据受限的线性表。

串连接:

 


  
  1. #include <stdio.h>
  2. #include <string.h>
  3. //串的定长顺序存储表示
  4. #define MAXSTRLEN 255 //用户可在255以内定义最大串长
  5. typedef unsigned char SString[MAXSTRLEN + 1]; //0号单元存放串的长度
  6. int Concat(SString *T,SString S1,SString S2)
  7. //用T返回S1和S2联接而成的新串。若未截断返回1,若截断返回0
  8. {
  9. int i = 1,j,uncut = 0;
  10. if(S1[0] + S2[0] <= MAXSTRLEN) //未截断
  11. {
  12. for (i = 1; i <= S1[0]; i++)//赋值时等号不可丢
  13. (*T)[i] = S1[i];
  14. for (j = 1; j <= S2[0]; j++)
  15. (*T)[S1[0]+j] = S2[j]; //(*T)[i+j] = S2[j]
  16. (*T)[0] = S1[0] + S2[0];
  17. uncut = 1;
  18. }
  19. else if(S1[0] < MAXSTRLEN) //截断
  20. {
  21. for (i = 1; i <= S1[0]; i++)//赋值时等号不可丢
  22. (*T)[i] = S1[i];
  23. for (j = S1[0] + 1; j <= MAXSTRLEN; j++)
  24. {
  25. (*T)[j] = S2[j - S1[0] ];
  26. (*T)[0] = MAXSTRLEN;
  27. uncut = 0;
  28. }
  29. }
  30. else
  31. {
  32. for (i = 0; i <= MAXSTRLEN; i++)
  33. (*T)[i] = S1[i];
  34. /*或者分开赋值,先赋值内容,再赋值长度
  35. for (i = 1; i <= MAXSTRLEN; i++)
  36. (*T)[i] = S1[i];
  37. (*T)[0] = MAXSTRLEN;
  38. */
  39. uncut = 0;
  40. }
  41. return uncut;
  42. }
  43. int SubString(SString *Sub,SString S,int pos,int len)
  44. //用Sub返回串S的第pos个字符起长度为len的子串
  45. //其中,1 ≤ pos ≤ StrLength(S)且0 ≤ len ≤ StrLength(S) - pos + 1(从pos开始到最后有多少字符)
  46. //第1个字符的下标为1,因为第0个字符存放字符长度
  47. {
  48. int i;
  49. if(pos < 1 || pos > S[0] || len < 0 || len > S[0] - pos + 1)
  50. return 0;
  51. for (i = 1; i <= len; i++)
  52. {
  53. //S中的[pos,len]的元素 -> *Sub中的[1,len]
  54. (*Sub)[i] = S[pos + i - 1];//下标运算符 > 寻址运算符的优先级
  55. }
  56. (*Sub)[0] = len;
  57. return 1;
  58. }
  59. void PrintStr(SString S)
  60. {
  61. int i;
  62. for (i = 1; i <= S[0]; i++)
  63. printf("%c",S[i]);
  64. printf("\n");
  65. }
  66. int main(void)
  67. {
  68. /*定长顺序存储初始化和打印的方法
  69. SString s = {4,'a','b','c','d'};
  70. int i;
  71. //s = "abc"; //不可直接赋值
  72. for (i = 1; i <= s[0]; i++)
  73. printf("%c",s[i]);
  74. */
  75. SString s1 = {4,'a','b','c','d'};
  76. SString s2 = {4,'e','f','g','h'},s3;
  77. SString T,Sub;
  78. int i;
  79. for (i = 1; i <= 255; i++)
  80. {
  81. s3[i] = 'a';
  82. if(i >= 248)
  83. s3[i] = 'K';
  84. }
  85. s3[0] = 255;
  86. SubString(&Sub,s3,247,8);
  87. PrintStr(Sub);
  88. return 0;
  89. }

 

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/83505987

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。