例3.3:编写一个函数expand(s1,s2)
,将字符串s1中的类似于a-z的简写符号扩展成等效的完整列表abc…xyz在s2中
。允许大小写字母和数字,并准备处理像a-b-c
、a-z0-9
和-a-z
这样的情况。确保前导或尾随的-被视为文本。
我正在尝试解决K&R的练习3.3,以下是我的代码:
void expand(char s1[], char s2[]){
int i; // index for first string
int j; // index for 2nd string
for(i = 0, j = 0; s1[i] != '\0'; ++i, ++j){
if(isalnum(s1[i]) && s1[i+1] == '-'){
char c = s1[i];
for(char c = s1[i]; c <= s1[i+2]; ++c, ++j){
s2[j] = c;
}
++i;
} else{
s2[j] = s1[i];
}
}
s2[j] = '\0';
}
它可以成功扩展任何范围,只要它不在任何其他范围之后,即在第一个范围完成后不会向s2添加任何内容。如果我放置这个语句:
printf("%c\n", c);
在第二个循环中,它打印出了正确的字符,但没有将其添加到s2中。
样本输入和输出:
In: akls aldio a-h 19 aodk
Out: akls aldio abcdefgh
In: 0-6 a-c lol
Out: 0123456
In: a-c-g 1okd 2-4
Out: abc
有没有人可以指引我正确的方向来纠正我的错误?
谢谢。
for
循环中删除++j
,并将它们放在您写入s2[j]
的位置之后,或者更好地使用s2[j++]
。 - Weather Vanei+=2
。你必须跳过两个字符,而不是一个(第三个字符在for
循环中处理)。 - Weather Vanea-h-k
这样的情况不起作用。我意识到需要进行另一种修改,但由于这个问题更紧迫,所以我把它放在了后面。 - Fazer