在Windows上编译的C程序可提供多种输出

时间:2018-07-24 14:49:24

标签: c windows

我开始怀疑这不仅是我的代码,而且我不知道为什么我的代码输出如此之多。有时会打印一些行,而有时则什么也不会打印。

我认为这很奇怪,我开始从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;
                }
        }
}

Odd output for tail

在运行它的前两个实例中,输出相同,但是不正确。它不会打印应该在第40行上打印的数量,并且看起来程序刚刚停止执行。

然后第三次运行它,它甚至没有打印出在运行该程序的前两个实例中打印的那些行!

我还使用了相同的输入,并且收到的输出与图片中的示例不同!在另一种情况下,该程序实际上输出了一些(但不是全部)行。

输出如何有如此大的差异?令人困惑的是,在一个运行程序的实例中,它如何打印某些行,而在其他实例中,它却不会。它与powershell / cmd的输出有关,而不与代码有关吗?我真的不知道。

我当前正在使用Visual Studio开发人员命令提示符来编译此代码。关于为什么该程序有时会打印行而其他时候却不打印行的想法?我最初的猜测是,它与Windows有关,因为过去我一直在与Windows控制台句柄搏斗。

编辑: 这太尴尬了。简而言之,一旦我整理了所有内容,我终于找到了问题所在。键盘上的键盘映射已更改,因此Ctrl-Z实际上是Ctrl-C,这解释了为什么我的输出有所不同。

0 个答案:

没有答案