C:仅打印最后n行(尾部程序)

C:仅打印最后n行(尾部程序),c,C,我正在为C做一些编程练习,我被这个问题困住了 问题:根据用户输入的参数仅打印最后n行 例如:论点2 用户输入:I\nAm\n学习\nC\n编程 I Am Learning C Programming C Programming 输出:C\n编程 I Am Learning C Programming C Programming 因此,基于用户提供的参数(在本例中为2),它应该只提供最后2行。到目前为止,我现在所做的是让用户可以输入一个参数 我现在拥有的代码 char input; cha

我正在为C做一些编程练习,我被这个问题困住了

问题:根据用户输入的参数仅打印最后n行

例如:论点2

用户输入:I\nAm\n学习\nC\n编程

I
Am
Learning
C
Programming
C
Programming
输出:C\n编程

I
Am
Learning
C
Programming
C
Programming
因此,基于用户提供的参数(在本例中为2),它应该只提供最后2行。到目前为止,我现在所做的是让用户可以输入一个参数

我现在拥有的代码

char input;
char main(int argc, char const *argv[]) {
   if(argc == 2) {
     input = *(argv[1]);
     return NULL;
   } else {
     return "Need one argument\n";
   }
}
我在考虑创建一个结构来保存线和线的长度。我有点了解它,但我不知道如何在C中实现它


谢谢大家!

由于我的徽章数量,我无法发表评论,所以我想发布我的答案。希望这能有所帮助

#包括
#包括
#包括
使用名称空间std;
int main(){
第一个字符[1024],第二个字符[1024];
//如果要退出循环,请键入零
int标志=1;
while(旗帜){
scanf(“%s”,第一个(&F);
扫描频率(“%s”,秒(&s);
printf(“输入0以退出\n”);
cin>>旗帜;
}
printf(“%s%s”,第一个,第二个);
系统(“暂停”);
返回0;

}
好的,答案将是以下代码:

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
  int current_line;
  int from_line;
  char *text;
  int i;

  if (argc < 3) {
    printf("%s\n", "Should provide at lest 2 arguments");
    return 1;
  }

  from_line = atoi(argv[2]);
  text = argv[1];
  current_line = 0;
  i = 0;

  while (text[i++] != '\0');

  while (i >= 0) {
    if (text[i] == '\n') {
      current_line++;
    }
    if (current_line == from_line) {
      break;
    }
    i--;
  }

  /*
    If text is "SOME TEXT" then text + 0 is also "SOME TEXT"
    but text + 1 would be "OME TEXT" and text + 5 "TEXT".
  */
  printf("%s\n", text + i + 1);

  return 0;
}
#包括
#包括
int main(int argc,char*argv[]){
int电流_线;
来自_线的int;
字符*文本;
int i;
如果(argc<3){
printf(“%s\n”,“应至少提供2个参数”);
返回1;
}
from_line=atoi(argv[2]);
text=argv[1];
当前_线=0;
i=0;
while(text[i++]!='\0');
而(i>=0){
如果(文本[i]='\n'){
当前_线++;
}
if(当前_线==来自_线){
打破
}
我--;
}
/*
如果文本是“一些文本”,那么文本+0也是“一些文本”
但是文本+1将是“OME文本”,文本+5将是“文本”。
*/
printf(“%s\n”,text+i+1);
返回0;
}
首先,它将检查用户是否至少向程序传递了2个参数。 然后将
argv[1]
分配给
char*text
指针。 接下来,我们将把
argv[2]
转换为整数,并将其存储在
int from_line
变量中

然后我们分配
inti
值0并运行循环以查找字符串的大小

我们将进入循环,因此需要初始化
int current\u line
, 它跟踪我们当前所在的线路

然后我们有一个循环,它将一直运行,直到我们到达字符串的末尾或者找到我们要查找的行, 循环将反向运行字符串(从结尾到结尾),因为我们正在从结尾寻找第n行

“\n”
在大多数编程语言中都表示换行符,如果我们找到了换行符,我们将增加当前的变量


最后,我们需要打印
'\n'
换行符前面的字符的字符串。

您尝试了什么?您好@Lazar,我更新了帖子并包含了我现在拥有的内容。谢谢如何声明
输入
?你有办法把它解析成一个数字吗?如果参数是
10
,则
输入将是
'1'
。您知道如何将多个
char
解析为一个数字吗?另外,
main
应该返回
int
,并且
NULL
都不需要一个参数\n”
应该是整数(尽管基于C如何工作的两个怪癖,编译时可能会出现警告)。如果你从某处得到这些练习,我建议你回到Hello World,从头开始。@Shaun正如我在另一篇评论中提到的,
char
只能包含一个字符,如果参数是
10
,它将不起作用。我真的认为你应该回去做一个较早的练习,因为你似乎有几个关于C的错误假设,这些假设超出了这个站点的范围,完全解释了。ouc++作为C++问题的答案,使用了CONIO。h。请不要使用JavaScript代码段格式化代码。这段代码不是JavaScript。如果参数不是两个呢?
scanf(“%s”,…)无法读取输入行-它会丢失所有空白。在长文本上失败<代码>和
scanf中(“%s”和“First”)导致错误的类型和技术上未定义的行为。这将从第
n行开始打印,但练习是从最后的
n行开始打印。如果你真的想为他们做OP的家庭作业,你可能应该尊重问题描述。