【发布时间】:2016-10-28 07:16:22
【问题描述】:
我正在尝试在 C 中模拟 tail 命令,但我遇到了问题。
我需要从键盘 (STDIN) 读取一些行(我不在乎有多少行)。当按下 Ctrl+d 时,该读取将被中断。这个功能我做了,但是不行。
int tail(int N)
{
int i, j, c;
char ** lines;
/* Char matrix dynamic declaration */
lines=NULL; // Char matrix declaration
lines=malloc(N*sizeof(char *));
for (i=0; i<N; i++){
lines[i]=malloc(80 * sizeof(char));
}
i=0;
while (true){ // I tried this loop, but doesn't work
/* This works. Lanes reading from the user's keyboard */
if(i>=N){
for(j=0; j<=N; j++){
if (j<(N-1))
lines[j]=lines[j+1];
}
scanf(" %[^\n]", lines[N-1]);
}else{
scanf(" %[^\n]", lines[i]);
}
i++;
/* ------------------------------------ */
c=getchar(); // This doesn't work
if(c==EOF)
goto end;
}
end:
for (i=0; i<N; i++){
printf("%s\n", lines[i]); // Showing those lanes
free(lines[i]); // Free memory
}
free(lines);
lines = NULL;
return 0;
}
我的问题是关于读取用户的键盘行并同时读取 ctrl+d。当我启动该功能时,它让我写了一些行,但是当我按下 Ctrl+D 时它没有检测到。我该怎么做?
编辑:
我尝试了一种捕获 Ctrl+d 的新方法,现在我的程序结束了,但是我遇到了一些问题。这是新代码:
int tail(int N)
{
int i, j, k, c;
char ** lines;
lines=NULL;
lines=malloc(N*sizeof(char *));
for (i=0; i<N; i++){
lines[i]=malloc(MAXLON * sizeof(char));
}
i=0;
while (true){
/* Read lines from keyboard. */
if(i<N)
scanf(" %[^\n]", lines[i]);
else{
for(j=0; j<N-1; j++){
for(k=0; k<MAXLON; k++){
lines[j][k]=lines[j+1][k];
}
}
scanf(" %[^\n]", lines[N-1]);
}
/* ------------------------------------ */
if((c=getchar())==EOF) break;
else i++;
}
for (i=0; i<N; i++){
printf("%s\n", lines[i]);
free(lines[i]);
}
free(lines);
lines= NULL;
return 0;
}
现在,我的程序从键盘捕获 N 行,直到我按 2 次 Ctrl+d,但我现在的问题是:如果我写 5 行是(例如,带有 tail(3),它显示最后 3 行):
Line 1
Line 2
Line 3
Line 4
Line 5
AND HERE I PRESS 2 TIMES CTRL+D
函数显示:
Line 4
Line 5
Line 5
怎么了?函数必须显示:
Line 3
Line 4
Line 5
非常感谢!
【问题讨论】:
-
在某些情况下
goto和标签是可以接受的。将它们用于循环或循环控制并不是这些情况中的一种。如果您想跳出循环,请使用break语句。 -
至于你的问题,当你按下文件结尾的键盘序列时,它通常必须在一个空行上。
-
您好!我也尝试过休息,但没有奏效。当我从键盘上写下一行并按回车然后按 Ctrl+D 时,函数没有完成...
-
在 Ctrl+D 之后是否也按了 Enter ?
-
这与您之前关于该主题的问题有何不同:Read from keyboard (controlled by Ctrl+d)?