K&;C:ex3.3中的R编程
例3.3:编写一个函数K&;C:ex3.3中的R编程,c,gcc,kernighan-and-ritchie,C,Gcc,Kernighan And Ritchie,例3.3:编写一个函数expand(s1,s2),该函数将字符串s1中的a-z等速记符号扩展到s2中的等效完整列表abc…xyz允许大小写字母和数字,并准备处理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
expand(s1,s2)
,该函数将字符串s1中的a-z等速记符号扩展到s2中的等效完整列表abc…xyz
允许大小写字母和数字,并准备处理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';
}
在第二个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
有人能给我指出正确的方向来纠正我的错误吗?谢谢。在您的内部
for
循环之后,j
已经超过了它应该在的位置,所以您可以跳过写入到一个位置。如果该位置恰好包含值0,它将终止该字符串,并且您不会看到其后的任何内容
而且,i
在它应该位于的位置之前
替换此项:
for(char c = s1[i]; c <= s1[i+2]; ++c, ++j){
s2[j] = c;
}
++i;
for(char c=s1[i];c正如dbush所建议的那样,您需要执行一个j--
,但是对于像a-c-g
这样的情况,您也需要更改内部for
条件。与其检查c,因为sps和dbush已经使其工作,不如让我再加上我的两分钱
如果可能的话,你应该保持你的内容简单易读。例如:你在循环中加载了太多的内容,而不是。只增加/减少你在For循环的第一部分中定义的索引。在你的例子中,这将是变量i
和c
。向量s1
和s2
上的迭代>应尽可能靠近向量
这就产生了:
void expand(char s1[], char s2[]){
int i;
int j;
char c;
for(i = 0, j = 0; s1[i] != '\0'; i++){
if(isalnum(s1[i]) && s1[i+1] == '-'){
for(c = s1[i]; c < s1[i+2]; c++){
s2[j++] = c;
}
i++;
} else{
s2[j++] = s1[i];
}
}
s2[j] = '\0';
}
哦,还有for循环的第三部分中的++i
等。我们现在有2016年了。欢迎来到堆栈溢出!听起来你可能需要学习如何使用调试器来逐步完成代码。有了一个好的调试器,你可以逐行执行你的程序,看看它偏离了你的预期。这也是一个必要的l如果你要做任何编程。进一步阅读:。我不知道这是否能解决问题,但我会从for
循环的两个中删除++j
,并将它们放在写入s2[j]
的位置之后,或者更好的方法是使用s2[j++]
@WeatherVane奏效了!有什么想法吗?@PaulR谢谢。我会研究c的调试器。我以前使用过内置在netbeans中的调试器,但没有用在c上。正如答案所说的。我的建议是在使用点增加索引,而不是在其他地方增加索引,以使您掌握逻辑。@dbush还提到了I+=2
在我开始之前。你必须跳过两个字符,而不是一个(第三个是在for
循环中处理的。i只需要增加一个,这样a-b-c
这样的情况就可以工作了。其余的都是正确的。它工作了,我理解它为什么不工作。如果你删除那个部分,我会将这个答案标记为正确的。谢谢。在@dbush的答案对th不起作用之后,我意识到并做了这个更改。)ose案例。这段代码还有一个问题,但是,尝试输入a-g-
,这不起作用…我正在尝试修复它,我在发布答案之前只尝试了你的测试输入,不麻烦。这是我的问题。我还没有完全完成。我是在意识到我被卡住后来到这里的。另外,在你的回答中,你说c
但我想你的意思是c
。是的,我的意思是c
,从代码中可以看出。这个问题很好。我可以在这里向您推荐一些好的输入。其中一些是“abc Def”、“abc-456”、“abc--Def”,与通常的输入不同……上面的代码失败了……希望您能解决它们,如果您需要任何指针,可以返回这里。。。。
for(char c = s1[i]; c <= s1[i+2]; ++c, ++j){
s2[j] = c;
}
i+=2;
j--;
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];
/* Do it c < instead of c<= */
for(char c = s1[i]; c < s1[i+2]; ++c, ++j){
s2[j] = c;
}
--j; /* Decrement j once */
++i;
} else {
s2[j] = s1[i];
}
}
s2[j] = '\0';
}
void expand(char s1[], char s2[]){
int i;
int j;
char c;
for(i = 0, j = 0; s1[i] != '\0'; i++){
if(isalnum(s1[i]) && s1[i+1] == '-'){
for(c = s1[i]; c < s1[i+2]; c++){
s2[j++] = c;
}
i++;
} else{
s2[j++] = s1[i];
}
}
s2[j] = '\0';
}
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(int argc, char **argv)
{
char s[200];
char s2[200];
int i;
memset(s,0,200);
memset(s2,0,200);
// put some spaces in between the arguments
for(i=1;i<argc;i++){
// counting ommitted!
strcat(s2,argv[i]);
s2[strlen(s2)] = ' ';
}
printf("In: %s\n",s2);
expand(s2,s);
printf("Out: %s\n",s);
exit(EXIT_SUCCESS);
}
$ gcc -W -Wall -std=c11 expand.c -o expand
./expand 0-9 ASD a-z QWE a-ch-r
In: 0-9 ASD a-z QWE a-c-r
Out: 0123456789 ASD abcdefghijklmnopqrstuvwxyz QWE abchijklmnopqr