-3

在 C 中,我们如何接受具有多行的输入,然后输出具有相反顺序的行(不改变每行中单词的顺序)。
例如:

输入:第 1 行
        2号线
        3号线
        4号线

输出:第 4 行
        3号线
        2号线
        1号线
4

4 回答 4

2

解决方案很简单。假设这lines是一个长度为的行数组(没有尾随换行符)size,应该执行以下循环:

for(i = size - 1; i >= 0; --i)
    puts(lines[i])

即,您只需以相反的顺序输出行:从最后一个开始,到第一个结束。

关于“如何输入和存储行”的问题:有几种选择。可以使用getline(POSIX 函数)或fgets函数(如有必要,您可以手动删除尾随换行符)来执行输入;不要使用gets- 这是邪恶的。您必须使用循环来输入行。realloc根据您的任务,行可以存储在静态或动态扩展(通过)数组中。或者你可以执行一个不那么聪明的技巧:编写一个递归函数,利用堆栈存储行(伪代码):

function reverseLines():
{
    string line;
    input(line);
    if not end-of-input():
    {
        reverseLines();
        output(line);
    }
}

但是如果你的输入足够大,就会遇到栈溢出错误。

于 2013-01-30T07:36:26.950 回答
2

如果您可以设置一些最大行长,则可以使用标准 Cfgets()函数读取行。如果您使用的是最新的 POSIX 兼容操作系统,或者拥有 GNU glibc,您可以使用 getline(),它会为行分配内存,因此您可以读取任何行长度。请在此处查看此答案。

对于每一行,您将获得char*指针。

如果您可以设置支持的最大行数,您可以使用char *lines[MY_MAX_LINE_COUNT]来存储指针,然后简单地从数组中以相反的顺序打印。更好的是实现一个非常简单的链表,它允许预先添加(这可能是最简单的链表代码,基本上是一个只有push的堆栈,不需要pop ...),然后在所有的时候打印行已阅读。


对于简单的情况,为了避免为每一行分配一个链表结构,最好将char*行指针存储到一个数组中,该数组使用realloc(): 增长。

首先是需要的变量:

int arraysize = 16; /* any size will do, 16 is nice round number */
char *lines[16] = malloc(sizeof(char*) * arraysize);
int linecount = 0;

然后循环获取输入:

while(/* test for eof or whatever */) {
    char *line = /* code to get the line */;

    if (linecount == arraysize) {
      arraysize *= 2;
      lines = realloc(lines, sizeof(char*) * arraysize);
    }
    lines[linecount] = line; /* old lines are at indexes 0..(linecount-1) */
    ++linecount;

并为此打印循环:

for(int index = linecount-1 ; index >= 0 ; --index) {
  puts(lines[index]); /* if line has newline stripped, else printf("%s", lines[index]);
}
于 2013-01-30T07:57:43.023 回答
1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void reverseLines(void);

int main (void) {
    reverseLines();

    return 0;
}

void reverseLines(void) {
    char *line;
    size_t len = 0;

    getline(&line, &len, stdin);

    if (strcmp(line, "") != 0) // NOT end of input
    {
        reverseLines();
        printf ("%s", line);
    }

    free (line);
}

/* References:
* 
* http://www.gnu.org/software/libc/manual/html_node/Line-Input.html
* http://souptonuts.sourceforge.net/code/getline.c.html
*/

感谢@nameless 的伪代码和@hyde 的getline 函数(我不知道)。

于 2013-01-30T08:17:14.937 回答
-2

您可以使用循环来获取这些行...即

for(...) {

  scanf(...); /* or use getline() here*/

}

并且还使用循环打印它,例如上面的答案。

而且很简单,如果你是编程新手,请多多练习。:)

于 2013-01-30T07:49:44.487 回答