首页 > 解决方案 > 在 Windows 上编译的 C 程序给出不同的输出

问题描述

我开始怀疑这不仅仅是我的代码,而且我无法弄清楚为什么我的代码输出如此多样。它有时会打印一些行,而其他时候,它不会打印任何东西。

认为这很奇怪,我开始从这里抓取代码,果然,我仍然遇到这种奇怪的意外行为,程序并不总是打印。

我从 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,这就解释了为什么我的输出会发生变化。

标签: cwindows

解决方案


推荐阅读