-1

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

如何将我的代码编辑到可以从用户输入的字符串中获取字符串并反转该字符串并输出结果的位置?

4

3 回答 3

1

至少考虑到线的正常长度,如果我这样做,我可能会递归地这样做。在伪代码中,它会是这样的:

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

或者,读一整行,然后大致使用上面的过程来处理它。

稍微谨慎和明智地使用标准库,这仅比伪代码复杂一点。

于 2012-12-07T07:10:35.593 回答
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 */

作为参考,首先谷歌点击“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 ? "" : " ") );
}
于 2012-12-07T08:21:28.243 回答
0

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

于 2012-12-07T07:26:25.140 回答