数据结构实训作业
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();去接收那个回车符,然后程序就没有问题了。解决问题之后感觉又舒服了。