编写一个程序,该程序将读取标准输入并将每一行回显到标准输出,并在其前面加上行号和选项卡。当您运行此程序并从终端输入行时,输入行将散布输出行。如果您的系统具有输出重定向并且您将输出重定向到文件,则该文件将看起来像带有编号行的输入。
以下是脚本应如何工作的示例。
用户输入粗体。
输入您的文字:
这是第1行。
1这是第1行。
这是第2行。
2这是第2行。
这是输入的最后一行。
3这是输入的最后一行。
最后一行将结束这个过程。
这是我到目前为止所做的:
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("Enter your text: \n");
while (1)
{
int ch = getc(stdin);
fflush(stdout);
if(ch == EOF) break;
putc(ch, stdout);
}
return 0;
}
我已经尝试了几个小时,现在没有运气,任何帮助都表示赞赏。我基本上不能让我的脚本显示示例输出。我可以让我的脚本将stdin显示为stdout,这就是全部。这是C作业。
答案 0 :(得分:3)
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int main(void){
size_t no = 0;
bool line_top = true;
printf("Enter your text: \n");
while (1) {
int ch = fgetc(stdin);
if(ch == EOF) break;
if(line_top)
printf("%zu ", ++no);
line_top = (ch == '\n');
fputc(ch, stdout);
}
fflush(stdout);
return 0;
}
答案 1 :(得分:2)
要正确完成作业,您需要了解该行是什么。您现有的代码逐个符号地读取和打印数据。这不会打印所要求的数字!
这里有两个解决方案。首先是逐行逐位切换到逐行切换,然后每次打印一行时打印一个递增计数器。其次是逐个符号地读取,但每次从输入中读取新的线符号时都会打印递增的数字。这里的一个小挑战是你需要一个状态 - 也就是说,一旦你看到了新的线条字符,你应该记住这个事实,但不要马上打印这个数字 - 这可能是输入中的最后一行。相反,只要您保存的状态告诉您,就打印一个数字,并在此之后重置标志。
另一个问题是如何处理空行 - 他们是否参与计数器增量 - 但这可能超出了作业范围。
答案 2 :(得分:1)
好的,你应该只执行作业所需的内容。这是我能想到的最直接的解决方案:
#include <stdio.h>
int main(void)
{
char buf[1024];
int num = 0;
/* read a line as long as we can read (no error / EOF) */
while (fgets(buf, 1024, stdin))
{
/* print line number */
printf("%d\t", ++num);
/* print what we actually read */
fputs(buf, stdout);
}
return 0;
}
试运行:
> ./numlines < numlines.c
1 #include <stdio.h>
2
3 int main(void)
4 {
5 char buf[1024];
6 int num = 0;
7
8 /* read a line as long as we can read (no error / EOF) */
9 while (fgets(buf, 1024, stdin))
10 {
11 /* print line number */
12 printf("%d\t", ++num);
13
14 /* print what we actually read */
15 fputs(buf, stdout);
16 }
17
18 return 0;
19 }
20
答案 3 :(得分:1)
代码需要跟踪行的开头。这可以通过使用fgets()
或查看个人char
阅读行来完成。
fgets()
可能更快,但它将行长度限制为某个常数。
fgetc()
一次获得1 unsigned char
(或EOF)。
以下是OP的主要内容,但增加了内部while
循环。
不需要太多代码。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
unsigned long long line_number = 0;
int ch;
while ((ch = fgetc(stdin)) != EOF) {
printf("%llu\t", ++line_number);
while (ch != EOF && fputc(ch, stdout) != '\n') {
ch = fgetc(stdin);
}
}
return 0;
}
答案 4 :(得分:0)
这是使用#include <string>
#include <iostream>
using namespace std;
int main()
{
unsigned int i=0;
string s;
cout<<"Enter your text: "<<endl;
while (std::getline(cin,s))
{
cout<<++i<<'\t'<<s<<endl;
}
return 0;
}
和#include <stdio.h>
#include <stdlib.h>
int main()
{
int exit=0, i=0, newline=1;
printf("Enter your text: \n");
while (!exit)
{
int ch = getc(stdin);
if(newline){
printf("\n%d\t",++i);
newline=0;
}
switch(ch){
case '\n':
newline=1;
printf("\n");
break;
case EOF:
printf("\n");
exit=1;
break;
default:
printf("%c",(char)ch);
break;
}
}
return 0;
}
的c ++解决方案。
Operation
这是一个解决方案:
class RequestContext {
var httpResponse:NSHTTPURLResponse?
var data:NSData?
var JSON:AnyObject?
}
答案 5 :(得分:0)
const int buflen = 1024;
char buffer[buflen];
int count = 0;
while (1)
{
char* line = fgets(buffer, buflen, stdin);
if (line == null)
break;
fprintf(stdout, "%d: %s\n", ++count, line);
}
答案 6 :(得分:0)
#include<stdio.h>
int main()
{
char line[1000];
int lineno=0;
while((fgets(line,1000, stdin)) != NULL)
{
lineno++;
printf("%d ",lineno);
fputs(line, stdout);
}
}
它将按预期工作。这是一种简单的方法。你不必放入while(1)和if条件并打破循环。