Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
K&;C:ex3.3中的R编程_C_Gcc_Kernighan And Ritchie - Fatal编程技术网

K&;C:ex3.3中的R编程

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

例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

    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