【发布时间】:2016-07-06 15:40:03
【问题描述】:
EX 3.3:编写一个函数expand(s1,s2),将字符串s1 中的a-z 等速记符号扩展为等效的完整列表abc...xyz in 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);
在第二个 for 循环中,它会打印出正确的字符,但不会将其添加到 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
谁能指出我纠正错误的正确方向?
谢谢。
【问题讨论】:
-
欢迎来到 Stack Overflow!听起来您可能需要学习如何使用调试器来逐步执行代码。使用好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏差在哪里。如果您要进行任何编程,这是必不可少的工具。进一步阅读:How to debug small programs.
-
我不知道这是否解决了它,但我会从两个
for循环中删除++j,并将它们放在您写入s2[j]的位置之后,或者更好,使用s2[j++]。 -
@WeatherVane 成功了!任何想法为什么?
-
@PaulR 谢谢。我将研究 c 的调试器。我以前用过netbeans内置的,但是c没用过。
-
正如答案所说。我的建议是在使用点而不是在其他地方增加索引,以使您能够处理逻辑。 @dbush 在我开始之前还提到了
i+=2。您必须跳过 2 个字符,而不是一个(第三个在for循环中处理。
标签: c gcc kernighan-and-ritchie