在 C 中,我们如何接受具有多行的输入,然后输出具有相反顺序的行(不改变每行中单词的顺序)。
例如:
输入:第 1 行 2号线 3号线 4号线 输出:第 4 行 3号线 2号线 1号线
解决方案很简单。假设这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);
}
}
但是如果你的输入足够大,就会遇到栈溢出错误。
如果您可以设置一些最大行长,则可以使用标准 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]);
}
#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 函数(我不知道)。
您可以使用循环来获取这些行...即
for(...) {
scanf(...); /* or use getline() here*/
}
并且还使用循环打印它,例如上面的答案。
而且很简单,如果你是编程新手,请多多练习。:)