这个程序如何工作C?

时间:2011-12-13 13:55:15

标签: c

我发现这个程序是K& R C编程书我是C编程的新手 我不明白为什么使用变量d而d的值变为d = 0 程序之间d = 1.

任何人都可以解释一下这个程序逻辑是什么我知道这个程序要替换 与\ t同样的标签。

#include <stdio.h>

int main()
{
    int c, d;

    while ( (c=getchar()) != EOF) {
        d = 0;
        if (c == '\\') {
            putchar('\\');
            putchar('\\');
            d = 1;
        }
        if (c == '\t') {
            putchar('\\');
            putchar('t');
            d = 1;
        }
        if (c == '\b') {
            putchar('\\');
            putchar('b');
            d = 1;
        }
        if (d == 0)
            putchar(c);        
    }
    return 0;
}

6 个答案:

答案 0 :(得分:4)

d用作标志变量(即传递单个二进制条件的变量,是或否)。当程序将字符d解释为特殊字符时,程序将c设置为1,并打印其斜杠前缀值。程序稍后会检查d标志以确定它是否已打印c。如果答案为否,则程序打印c;否则,它会继续循环的下一次迭代。

答案 1 :(得分:1)

嗯...让我们一步一步

  1. 说你读'G'
  2. d被指定为0
  3. 没有第3个if s“工作”
  4. 'G'输出

  5. 现在你读了一个标签
  6. 第二个if“工作”
  7. 输出2个字符\t
  8. d分配1
  9. 不再输出

  10. 现在你读了一个反斜杠
  11. 第一个if“工作”
  12. 输出2个字符\\
  13. d分配1
  14. 不再输出

  15. 和C

答案 2 :(得分:0)

'd'的值用于确定是否已经输出,所以这一行:

if (d == 0)
        putchar(c);

当输入不是上述之一时执行。 ('\\','\ t','\ b')

答案 3 :(得分:0)

它正在读取用户的输入,&gt;一次一个字符。并检查escape chars

因为转义字符实际上包含2个字符,所以如果条件转义字符被打印(2个putchars),这是由用户输入的。

d用作告诉用户是否输入了转义字符的标志。

d == 1 =&gt;用户输入了转义字符,它已经打印出来了。不要再打印

d == 0 =&gt;用户输入普通字符,现在应该打印出来。

注意:其他转义字符也存在,但未在上述程序中处理。

答案 4 :(得分:0)

这实际上是一个写得很差的程序。更好的版本可能写成:

#include <stdio.h>

int main()
{
    int c;

    while ( (c=getchar()) != EOF) {
        switch (c) {
        case '\\':
            putchar('\\');
            putchar('\\');
            break;
        case '\t':
            putchar('\\');
            putchar('t');
            break;
        case '\b':
            putchar('\\');
            putchar('b');
            break;
        default:
            putchar(c);
        }    
    }
    return 0;
}

此处,不需要额外变量d来跟踪程序是否已回显输入字符。我认为,理解重写版本的功能要容易得多。我很惊讶“C程序设计语言”会有这么糟糕的程序。

答案 5 :(得分:0)

简单。

while ( (c=getchar()) != EOF) { 

虽然C不是文件的结尾(EOF是结尾文本文件的最后一个字符的代码),即在此文本文件中有要读取的字符时。 检查c(此字符)是否等于'\'或\ t(水平制表)或\ b(退格)。如果匹配,只需根据我的规则打印并将d设置为1.

对于所有其他角色,只需按原样打印。

if (d == 0)     
        putchar(c);  

我怎么知道它是否有规律性? d = 0.当循环再次开始时,它将d设置为0,如果找到3个特殊字符中的一个,则再次将d设置为1,以防止它再次在最后一部分打印。