在写程序之前感觉很多细节没想清楚,写出来之后就发现有些是不需要考虑太多,应该先把主体写出来,把一些细致的地方放到下一步的调试中去。
/* 练习3-3
编写函数expand(s1,s2),将字符串s1中诸如a-z一类的速记符号在字符串s2中扩展成等价
的完整列表abc......xyz。允许处理大小写字母和数字,并可以处理诸如a-b-c与a-z0-9
与-a-z等情况。正确安排好前导与尾随的-。
*/
#include <stdio.h>
void expand(char *s1, char *s2)
{
int i, j = 0, k;
for (i = 0; s2[i] != '\0'; i++)
{
if (s2[i] == '-' && i > 0 && s2[i+1] != '\0') /*遇到一个位于“中部”的'-'号 */
{
/* 若'-'号两边都是字母 */
if ((s2[i-1] >= 'A' && s2[i-1] <= 'Z' && s2[i+1] >= 'A' && s2[i+1] <= 'Z') ||
(s2[i-1] >= 'a' && s2[i-1] <= 'z' && s2[i+1] >= 'a' && s2[i+1] <= 'z'))
{
/* 扩展并输出(不包括开头第一个字母,因其已经被输出过) */
for (k = s2[i-1]+1; k <= s2[i+1]; k++)
s1[j++] = k;
i++;
}
/* 若'-'号两边都是数字 */
if (s2[i-1] >= '0' && s2[i-1] <= '9' && s2[i+1] >= '0' && s2[i+1] <= '9')
{
/* 扩展并输出(不包括开头第一个数字,因其已经被输出过) */
for (k = s2[i-1]+1; k <= s2[i+1]; k++)
s1[j++] = k;
i++;
}
}
else
{
s1[j++] = s2[i];
}
}
}
main()
{
char s2[] = "-a-b-fx-z0-9-";
char s1[100] = "";
expand(s1, s2);
printf("string:\n%s\n", s2);
printf("expand:\n%s\n", s1);
return 0;
}