0

我是编程新手,我似乎无法理解为什么我的代码中会发生以下情况,即:

#include <stdio.h>

/*copy input to output; 1st version */

main()
{
    int c;

c = getchar();
while (c != EOF) {
    putchar(c);
    c = getchar();
    }
}

所以在做了一些阅读之后,我收集了以下内容:

  1. 在我按下 Enter 之前,什么都不会执行,因为getchar()它是一个保持功能。
  2. 在我按下 Enter 之前,我所有的击键都存储在缓冲区中
  3. getchar()被调用时,它只是查看缓冲区中的第一个值,成为该值,然后从缓冲区中删除该值。

我的问题是,当我删除第一个c = getchar()生成的代码时,它的功能与原始代码完全相同,尽管在我输入任何内容之前,屏幕上会立即出现一个笑脸符号。为什么会这样?是不是因为putchar(c)没有保留代码,而是尝试显示c尚未定义的 ,因此它输出了一些随机符号?如果有帮助,我正在使用 Code::Blocks。

4

3 回答 3

1

您列出的功能将简单地回显您键入的每个字符。确实,I/O 是“缓冲的”。执行此缓冲的是操作系统的键盘输入驱动程序。当它缓冲您按下的键时,它会将每个键回显给您。当您按下换行符时,驱动程序将缓冲的字符传递给您的程序,getchar然后查看它们。

如所写,该功能应该可以正常工作:

c = getchar();   // get (buffer) the first char

while (c != EOF) {  // while the user has not typed ^D (EOF)
    putchar(c);     // put the character retrieved
    c = getchar();  // get the next character
}

由于键盘驱动程序缓冲,它只会在您每次按换行符或使用 ^D (EOF) 退出时回显。

笑脸来自@YuHao 所描述的:你可能会错过getchar你跑的第一个,putchar回声垃圾也是如此。可能是 0,在您的屏幕上看起来像一个笑脸。

于 2013-06-29T17:04:24.393 回答
0

如果省略第一个getchar(),代码将如下所示:

int c;
while (c != EOF) {
    putchar(c);
    c = getchar();
}

在这里,c是未初始化的,所以第一次调用putchar(c)会输出一个垃圾值,这就是你得到笑脸的地方。

于 2013-06-29T16:55:54.223 回答
0

“我是编程新手”

不建议您使用 C 来学习编程(而您遇到的困难是因为 C 语言)。例如,我的第一堂计算机科学课是帕斯卡。其他大学可能会使用 scheme 或 lisp,甚至结构化自然语言来教授编程。麻省理工学院的在线课程是用 python 给出的。

C 不是您在编程的头几个月想要使用的语言。您的情况的具体原因是由于语言允许您使用未初始化值的值。

当您声明整数变量“c”时,它会在程序堆栈上获得一个隐式保留空间,但没有任何有意义的值:它是“垃圾”,该值是当时内存中已经存在的任何值。C 语言要求程序员在使用变量之前隐含地知道他需要分配一些值。删除第一个 getchar 会导致在 while 条件 (c != EOF) 和 putchar(c) 中赋值之前使用,这两者都在 c 具有任何有意义的值之前。

考虑用 python 重写的相同代码:

import sys

c = sys.stdin.read(1)
while c != '':
    c = sys.stdin.read(1)
    sys.stdout.write(c)

删除初始读取,您会收到以下错误:

hdante@aielwaste:/tmp$ python3 1.py 
Traceback (most recent call last):
  File "1.py", line 3, in <module>
    while c != '':
NameError: name 'c' is not defined

那是 NameError:您使用了未分配给它的值导致语言错误。

有关更多信息,请尝试在线课程,例如:

http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-00-introduction-to-computer-science-and-programming-fall-2008/video-lectures/

关于未初始化的值:

http://en.wikipedia.org/wiki/Uninitialized_variable

于 2013-06-29T17:41:03.203 回答