我开始怀疑这不仅是我的代码,而且我不知道为什么我的代码输出如此之多。有时会打印一些行,而有时则什么也不会打印。
我认为这很奇怪,我开始从here抓取代码,果然,我仍然遇到这种奇怪的意外行为,即程序并不总是打印出来。
我以K&R C书为例。这是您尝试模仿尾巴的练习。但是,当我编译下面的代码并运行它时,即使我每次都使用相同的输入,输出也会有所不同。 我专门运行了这段代码:
#include <stdio.h>
#include <stdlib.h>
#define MAXLINES 1024
#define MAXINPUT 10240
#define DEF_NUM_LINES 10
int getlines (char *);
void parse_args (int, char **);
char linestr[MAXINPUT];
char *lineptr[MAXLINES];
int num_of_lines = DEF_NUM_LINES;
int main (int argc, char *argv[])
{
int lines;
int ltp = 0;
int i; int c;
*lineptr = linestr;
/* Parse the argument strings passed to the program */
if (argc > 1) {
parse_args(argc, argv);
}
/* Get the input from the user */
lines = getlines(linestr);
if (num_of_lines == 0) {
num_of_lines = 10;
}
ltp = lines < num_of_lines ? lines : num_of_lines;
printf ("\n>>> Printing %d line(s):\n", ltp);
if (ltp == DEF_NUM_LINES) {
printf (">>> The default number of lines to print is ");
printf ("%d\n", DEF_NUM_LINES);
}
printf ("\n");
for (i = lines; i > 0; i--) {
while ((c = *lineptr[0]++) != '\n') {
if (i <= ltp) {
printf ("%c", c);
}
}
if (c == '\n' && i <= ltp) {
printf ("\n");
}
}
return 0;
}
int getlines (char *buffer)
{
int i, count = 0;
char c;
for (i = 0; (c = getchar()) != EOF && i < MAXINPUT; i++) {
*buffer++ = c;
if (c == '\n') {
lineptr[++count] = buffer;
}
}
*buffer++ = '\0';
return count;
}
void parse_args (int argc, char **argv)
{
char c;
while (--argc > 0 && (*++argv)[0] == '-') {
c = *++argv[0];
switch (c) {
case 'n':
num_of_lines = atoi(*(argv + 1));
break;
}
}
}
在运行它的前两个实例中,输出相同,但是不正确。它不会打印应该在第40行上打印的数量,并且看起来程序刚刚停止执行。
然后第三次运行它,它甚至没有打印出在运行该程序的前两个实例中打印的那些行!
我还使用了相同的输入,并且收到的输出与图片中的示例不同!在另一种情况下,该程序实际上输出了一些(但不是全部)行。
输出如何有如此大的差异?令人困惑的是,在一个运行程序的实例中,它如何打印某些行,而在其他实例中,它却不会。它与powershell / cmd的输出有关,而不与代码有关吗?我真的不知道。
我当前正在使用Visual Studio开发人员命令提示符来编译此代码。关于为什么该程序有时会打印行而其他时候却不打印行的想法?我最初的猜测是,它与Windows有关,因为过去我一直在与Windows控制台句柄搏斗。
编辑: 这太尴尬了。简而言之,一旦我整理了所有内容,我终于找到了问题所在。键盘上的键盘映射已更改,因此Ctrl-Z实际上是Ctrl-C,这解释了为什么我的输出有所不同。