Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.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
C中字符串中单词的颠倒顺序_C - Fatal编程技术网

C中字符串中单词的颠倒顺序

C中字符串中单词的颠倒顺序,c,C,因此,我正在尝试编写一个C程序,它将检查提供给标准输入的数据,并向后打印(到标准输出)每行上的字,每个字之间正好有一个空格。我不想在一个词中颠倒字母;我只想颠倒单词的顺序。我想让程序也注意命令行参数,并让程序处理多个文件名。以下是我提出的一些代码,我想知道我是否走上了正确的道路,如果不是的话,可能会发生什么变化,以达到我需要的目的: #include<stdio.h> #include<math.h> void rev(char *l, char *r); int m

因此,我正在尝试编写一个C程序,它将检查提供给标准输入的数据,并向后打印(到标准输出)每行上的字,每个字之间正好有一个空格。我不想在一个词中颠倒字母;我只想颠倒单词的顺序。我想让程序也注意命令行参数,并让程序处理多个文件名。以下是我提出的一些代码,我想知道我是否走上了正确的道路,如果不是的话,可能会发生什么变化,以达到我需要的目的:

#include<stdio.h>
#include<math.h>

void rev(char *l, char *r);

int main(int argc, char *argv[]) {
    char buf[] = "the world will go on forever";
    char *end, *x, *y;
    for(end=buf; *end; end++);
    rev(buf,end-1);
    x = buf-1;
    y = buf;
    while(x++ < end) {
        if(*x == '\0' || *x == ' ') {
           rev(y,x-1);
           y = x+1;
        }
    }
    printf("%s\n",buf);
    return(0);
}

void rev(char *l,char *r) {
    char t;
    while(l < r) {
        t = *l;
        *l++ = *r;
        *r-- = t;
    }
}
#包括
#包括
无效版本(字符*l,字符*r);
int main(int argc,char*argv[]){
char buf[]=“世界将永远继续”;
字符*结束,*x,*y;
for(end=buf;*end;end++);
修订版(buf,1月底);
x=buf-1;
y=buf;
while(x++

我如何编辑代码,使其能够从用户可能键入的字符串中提取字符串并反转该字符串并输出结果?

至少在给定正常行长的情况下,如果我这样做,我可能会递归地这样做。在伪代码中,它类似于:

function reverse_words:
  read a word
  if end of line return
  call reverse_words
  print word that was read
  return
end function
或者,读一整行,然后大致按照上面的步骤进行处理


只要稍微小心并明智地使用标准库,这只比伪代码稍微复杂。

因此,看起来您所拥有的将确实反转单词。有其他方法可以做到这一点,但这可能同样有效。根据您提出的问题,我假设您最终希望反转文件中包含的单词,这些文件的名称在命令行中传递。如果这是正确的,我会将主函数中的逻辑取出,放入一个单独的函数中,名为reversewords(),并将指针传递给它。然后我将循环遍历您的参数并处理每个参数,必要时调用reversewords函数。我在您的问题中看到,您还希望反转用户可能键入的输入行。为此,我将在所有命令行解析完成后添加额外的代码。这将由一个循环组成,该循环反复调用get()并将结果指针传递给reversewords函数。我希望这会有所帮助。

要阅读用户的输入,请更改char buf[]=“世界将永远继续”至:

char buf[123];
printf("Please enter a bunch of words: ");
fgets(buf, sizeof buf, stdin);
然后编写代码以删除轨迹换行符,如果您只需要空格,fgets不会删除该换行符(如果有):

int endInd = strlen(buf)-1;
if (buf[endInd] == '\n') buf[endInd] = 0;
/* else user typed longer line than sizeof buf, extra chars are left unread */
作为参考,谷歌首个热门的“男人fgets”:

请注意这一点,因为它也是
gets
的手册页。永远不要使用
获取
,无法防止用户给您带来缓冲区溢出

备选答案:或者您的意思是,读取命令行参数并按相反顺序打印它们?试试这个:

for (int ind = argc-1; ind >=1; --ind) {
    // use conditional operator to print space after all args except the one printed last
    printf("%s%s", argv[ind], (ind == 1 ? "" : " ") );
}

为什么你认为你没有走上正确的轨道?是否存在一些不正常的情况?如果有问题,您可以使用调试器逐行检查代码,同时检查所有变量和指针是否正常。请只问可以回答的问题。@misha很好奇为什么您编辑了“这是我们拥有的美好的一天”中的代码“世界将永远继续”?您需要做的第一个更改是正确缩进代码。