读《C程序设计语言》笔记10
编写按照ASCII字符表进行扩展的函数:
函数基本要求:编写函数expand(s1, s2),将字符串s1中类似于a-z一类的速记符号在字符串s2中扩展为等价的完整列表abc...xyz。该函数可以处理大小写字母和数字,并可以处理a-b-c、a-z0-9与a-z等类似的情况。作为前导和尾随的字符原样复制。
这是课本练习3-3的题目要求:
按照要求编写如下代码:
#include<stdio.h> //expand:expand shorthand notation in s1 into string s2 void expand(char s1[], char s2[]) { char c; int i, j; i=j=0; while((c=s1[i++])!='\0') //fetch a char from s1[] if('-'==s1[i] && s1[i+1]>=c) { i++; //skip '-' while(c < s1[i]) //expand shorthand s2[j++]=c++; } else s2[j++]=c; s2[j]='\0'; } int main() { char s1[]="a-f-k0-7"; char s2[100]=""; expand(s1, s2); printf("扩展后的字符串为:%s\n",s2); system("pause"); return 0; }
运行结果如下:
百度了下扩展字符串,csdn上有人提到有公司笔试题类似这个题目,但是提出了更多的要求:要求能完成将S1中字符串按照ASCII表中顺序展开后保存在S2中,S1中可能包含字母(字母不区分大小写),数字和"-",如果遇到"-",将其去除.
例: S1 S2
a-f-k abcdefghijk (可以假设S1中的字母都是升序排列的)
-d-g3-7 defg34567
a-D-4-6- abcd456
另外S2在此函数外未定义。
链接:http://topic.csdn.net/u/20080219/15/e5ee5513-b40b-4947-9596-964fedeec151.html
稍后按要求修改程序更新。
修改程序后源代码如下:
#include <stdio.h> #include <string.h> //lower s1 void lower(char s1[]) { int i=0; for(; i<=strlen(s1); i++) { if(s1[i]>='A' && s1[i]<='Z') s1[i]+='a'-'A'; } } //expand:expand shorthand notation in s1 into string s2 void expand(char s1[], char s2[]) { char c; int i, j; i=j=0; lower(s1); while((c=s1[i++])!='\0') //fetch a char from s1[] if('-'==s1[i] && s1[i+1]>=c) { i++; while(c <= s1[i]) //expand shorthand s2[j++]=c++; } if(s1[i]!= '-') //修改这里后,上面的while循环要修改,扩展 s2[j++]=c; //的中间部分及尾部均要在while中完成输入到s2 s2[j]='\0'; } int main() { char s1[]="-a-D-4-8-"; char s2[100]=""; expand(s1, s2); printf("扩展后的字符串为:%s\n",s2); system("pause"); return 0; }
执行结果如下:(测试用例用的是最复杂的那个)
不过,**s2,和函数外未定义s2,怎么处理...