C中字符串中单词的反转顺序

时间:2012-12-07 07:02:11

标签: c

所以我正在尝试编写一个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;
    }
}

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

3 个答案:

答案 0 :(得分:1)

至少给出正常长度的行,如果我这样做,我可能可能递归执行。在伪代码中,它将类似于:

function reverse_words:
  read a word
  if end of line return
  call reverse_words
  print word that was read
  return
end function

或者,阅读整行,然后大致使用上述程序来处理它。

通过谨慎和明智地使用标准库,这只比伪代码复杂得多。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

要阅读用户的输入,请将char buf[] = "the world will go on forever";更改为:

char buf[123];
printf("Please enter a bunch of words: ");
fgets(buf, sizeof buf, stdin);

然后代码删除traling换行符,如果你只想要空格,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 */

作为参考,首先google点击“man fgets”:http://www.manpagez.com/man/3/fgets/

请注意,因为它也是gets的手册页。 从不使用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 ? "" : " ") );
}