#include <stdio.h>
void expand(char * s1, char * s2);
int main()
{
return 0;
}
/*用strchr实现A-Z a-z的范围判定*/
void expand(char * s1, char * s2)
{
/* 把'-' 和 非'-'作为 分类的标准*/
/* 其他不满足规则的字符都视为非法,判定出错信息 */
/* 对于字符串前和字符串后的*/
static char upper_alph[27] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
static char lower_alph[27] = "abcdefghijklmnopqrstuvwxyz";
static char digits[11] = "0123456789";
char * start, * end, * p;
int i = 0;
int j = 0;
/* Loop through characters in s2 */
while ( s2[i] ) {
switch( s2[i] ) {
case '-':
if ( i == 0 || s2[i+1] == '\0' ) {
/* '-' is leading or trailing, so just copy it */
s1[j++] = '-';
++i;
break;
}
else {
/* We have a "range" to extrapolate. Test whether
the two operands are part of the same range. If
so, store pointers to the first and last characters
in the range in start and end, respectively. If
not, output and error message and skip this range. */
if ( (start = strchr(upper_alph, s2[i-1])) &&
(end = strchr(upper_alph, s2[i+1])) )
;
else if ( (start = strchr(lower_alph, s2[i-1])) &&
(end = strchr(lower_alph, s2[i+1])) )
;
else if ( (start = strchr(digits, s2[i-1])) &&
(end = strchr(digits, s2[i+1])) )
;
else {
/* We have mismatched operands in the range,
such as 'a-R', or '3-X', so output an error
message, and just copy the range expression. */
fprintf(stderr, "EX3_3: Mismatched operands '%c-%c'\n",
s2[i-1], s2[i+1]);
s1[j++] = s2[i-1];
s1[j++] = s2[i++];
break;
}
/* Expand the range */
p = start;
while ( p != end ) {
s1[j++] = *p;
if ( end > start )
++p;
else
--p;
}
s1[j++] = *p;
i += 2;
}
break;
default:
if ( s2[i+1] == '-' && s2[i+2] != '\0' ) {
/* This character is the first operand in
a range, so just skip it - the range will
be processed in the next iteration of
the loop. */
++i;
}
else {
/* Just a normal character, so copy it */
s1[j++] = s2[i++];
}
break;
}
}
s1[j] = s2[i]; /* Don't forget the null character */
}
expand函数
最新推荐文章于 2023-10-24 16:49:46 发布
本文深入探讨了字符范围判断与操作的算法实现,包括A-Za-z范围内的字符处理,通过strchr函数实现范围判定,以及针对不同字符类型(如字母、数字等)的特定操作逻辑,旨在提升字符串处理的效率。
685

被折叠的 条评论
为什么被折叠?



