练习 3-3 编写函数 expand(s1, s2),将字符串 s1 中类似于 a-z 一类的速记符号在字符串 s2 中扩展为等价的完整列表 abc…xyz。该函数可以处理大小写字母和数字,并可以处理 a-b-c、a-z0-9 与-a-z 等类似的情况。作为前导和尾随的-字符原样排印。
写完都不想看了,改的太久了。。。
#include <stdio.h>
#include <ctype.h>
#define MAXLEN 1000
void expand(char s[], char t[]);
int main()
{
int i, c;
char s[MAXLEN], t[MAXLEN];
printf("input string:\n");
while ((c = getchar()) != EOF)
s[i++] = c;
expand(s, t);
printf("expanded string:\n%s\n", t);
return 0;
}
void expand(char s[], char t[])
{
int i, j, k;
for (i = 0, j = 0; s[i] != '\0'; i++)
{
if (s[i] == '-' && i > 0)
{
if (islower(s[i-1]) && islower(s[i+1]) && s[i-1] < s[i+1])
{
j--;
for (k = 0; k <= (s[i+1] - s[i-1]); k++, j++)
t[j] = s[i-1] + k;
i++;
}
else if (isupper(s[i-1]) && isupper(s[i+1]) && s[i-1] < s[i+1])
{
j--;
for (k = 0; k <= (s[i+1] - s[i-1]); k++, j++)
t[j] = s[i-1] + k;
i++;
}
else if (isdigit(s[i-1]) && isdigit(s[i+1]) && s[i-1] < s[i+1])
{
j--;
for (k = 0; k <= (s[i+1] - s[i-1]); k++, j++)
t[j] = s[i-1] + k;
i++;
}
else
t[j++] = '-';
}
else
t[j++] = s[i];
if (s[i+1] == '\0')
t[j] = '\0';
}
printf("break\n");
return;
}