数据结构实训作业

  1 #include <stdio.h>
  2 #define DataMax 100
  3 typedef struct {
  4     char data[DataMax];
  5     int length;
  6 }string;
  7 //初始化字符串
  8 void initString(string *s)
  9 {
 10     s->length = 0;
 11 }
 12 //输入字符串
 13 void inputString(string *s)
 14 {
 15     char c;
 16     int i = 0;
 17     printf("请输入字符串,以#为结束标志:");
 18     while((c = getchar()) != '#')
 19     {
 20         s->data[i++] = c;
 21     }
 22     s->data[i] = '\0';
 23     s->length = i;
 24 }
 25 //得到字符串的长度
 26 int getLength(string *s)
 27 {
 28     return s->length;
 29 }
 30 //将s2的内容复制到s1
 31 void copyString(string *s1, string *s2)
 32 {
 33     int i;
 34     for(i =0; i<s2->length; i++)
 35     {
 36         s1->data[i] = s2->data[i];
 37     }
 38     s1->length = s2->length;
 39     s1->data[i] = '\0';
 40 }
 41 //判断字符串是否相等
 42 int equalString(string *s1, string *s2)
 43 {
 44     int i;
 45     //如果两个字符串长度不一样的话那两个字符串一定不相等
 46     if(s1->length != s2->length)
 47     {
 48         return 1;
 49     }
 50     for(i = 0; s1->data[i] == s2->data[i] && s1->data[i] != '\0' && s2->data[i] != '\0'; i++);
 51     if(s1->data[i] == s2->data[i])
 52     {
 53         return 0;
 54     }
 55 }
 56 //连接两个字符串
 57 string concatString(string *s1, string *s2)
 58 {
 59     string s3;
 60     int i,j;
 61     for(i =0; i<s1->length; i++)
 62     {
 63         s3.data[i] = s1->data[i];
 64     }
 65     for(i =s1->length,j =0; j<s2->length; i++,j++)
 66     {
 67         s3.data[i] = s2->data[j];
 68     }
 69     s3.data[i] = '\0';
 70     s3.length = s1->length + s2->length;
 71     return s3;
 72 }
 73 //求子串返回串s的第i个位置开始的j个字符组成的串
 74 string subString(string *s, int i, int j)
 75 {
 76     string s1;
 77     if(i<1 ||i>s->length ||j<0||i+j>s->length)
 78     {
 79         printf("输入的数字有错误");
 80     }
 81     for(int k = 0; k<j; k++)
 82     {
 83         s1.data[k] = s->data[i-1+k];
 84     }
 85     s1.length = j;
 86     return s1;
 87 }
 88 //返回子串s2在主串s1中的位置
 89 int Index(string *s1, string *s2)
 90 {
 91     int i;
 92     int j;
 93     for(i =0; i<s1->length; i++)
 94     {
 95         j =0;
 96         while(s1->data[i] == s2->data[j])
 97         {
 98             i++;
 99             j++;
100         }
101         i = i-j;
102         if(j >= s2->length)
103         {
104             return i+1;
105         }
106     }
107 }
108 //输出字符串
109 void dispStr(string *s)
110 {
111     for(int i = 0; i<s->length; i++)
112     {
113         printf("%c",s->data[i]);
114     }
115     printf("\n");
116 }
117 int main() {
118     string s1;
119     string s2;
120     string s3;
121     string s4;
122     string subStr;
123     int position = -1;
124     int i,j;
125     initString(&s1);
126     inputString(&s1);
127     copyString(&s2, &s1);
128     printf("字符串s1:");
129     dispStr(&s1);
130     printf("字符串s2:");
131     dispStr(&s2);
132     printf("字符串s1的长度为:%d\n",s1.length);
133     printf("字符串s2的长度为:%d\n",s2.length);
134     if(!equalString(&s1, &s2))
135     {
136         printf("字符串s1与字符串s2相等\n");
137     }
138     else
139     {
140         printf("字符串s1与字符串s2不相等\n");
141     }
142     s3 = concatString(&s1, &s2);
143     printf("字符串s1与字符串s2连接之后的字符串s3:");
144     dispStr(&s3);
145     printf("请输入您需要查找的子串从第几个位置开始,长度为多少:");
146     scanf("%d%d",&i,&j);
147     s4 = subString(&s1, i, j);
148     printf("从第%d个位置开始,长度为%d的字符串s4:",i,j);
149     dispStr(&s4);
150     printf("请输入您需要查找位置的子串:");
151     getchar();
152     inputString(&subStr);
153     position = Index(&s1, &subStr);
154     if(position == -1)
155     {
156         printf("您输入的字符串不是s1的子串");
157     }
158     else
159     {
160         printf("您输入的子串在主串s1中的%d个位置",position);
161     }
162 }

在此151 行那个getchar();是必要的,本来有一个bug看了好久看不出来有什么问题,后来进行debug调试,然后发现在给subStr中的data数组里面第一个元素竟然是一个回车符,所以我猜想应该是我输入的时候有回车符被subStr给接收到了,所以我在给subStr赋值前加了一个getchar();去接收那个回车符,然后程序就没有问题了。解决问题之后感觉又舒服了。

posted @ 2019-05-19 23:22  oops_w  阅读(330)  评论(0编辑  收藏  举报