在C中,我们如何接受具有多行的输入,然后输出具有相反顺序的行(不改变每行中单词的顺序)。
例如:
Input: Line 1 Line 2 Line 3 Line 4 Output: Line 4 Line 3 Line 2 Line 1
答案 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*/
}
并且还使用循环来打印它,例如上面的答案。
这很简单,如果你是编程新手,请练习越来越多。 :)