在C中没有反转单词的行的反向顺序

时间:2013-01-30 07:28:04

标签: c string reverse

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

Input:  Line 1
        Line 2
        Line 3
        Line 4

Output: Line 4
        Line 3
        Line 2
        Line 1

4 个答案:

答案 0 :(得分: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);
    }
}

但如果您的输入足够大,您将遇到堆栈溢出错误。

答案 1 :(得分:2)

如果您可以设置一些最大行长度,则可以使用标准C fgets()函数读取行。如果您使用的是最近的POSIX兼容操作系统,或者使用GNU glibc,则可以使用getline(),它将为行分配内存,因此您可以读取任何行长度。 See this answer来自SO。

对于每一行,您将获得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]);
}

答案 2 :(得分: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 for pseudocode和@hyde for getline function(我不知道)。

答案 3 :(得分:-2)

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

for(...) {

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

}

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

这很简单,如果你是编程新手,请练习越来越多。 :)