c - 在 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,这就解释了为什么我的输出会发生变化。
解决方案
推荐阅读
- scala - Scala Map 保存到文件 - Hadoop
- angular - 离子 - 会话到期记住最后一页几秒钟?
- angular - 函数 rowSelected 已被调用两次(选中和取消选中)
- wordpress - 如何禁用某些重力形式 ID 的渲染 HTML 代码?
- python - 有没有办法使用 for 循环使其更简洁?
- hdl - 如何在HDL中制作位选择芯片?
- javascript - 从谷歌地图的 json 过滤标记:检查按钮不起作用
- python - 在计算过程中改变变量的增加 - python
- import - Neo4J:如何从 csv 加载 20 亿条记录?
- javascript - React 头盔异步返回带有 Apollo 客户端的服务器上的空标签