C编程语言,第1章练习1.10(Getchar和Putchar)

时间:2014-04-07 04:05:58

标签: c getchar putchar

我已经在这工作了2个小时而且我被卡住了...我在网上找到了答案,但这并不能帮助我学习我明显遗漏的概念

提示:编写程序将其输入复制到其输出,将每个选项卡替换为\t,每个退格键替换\b,每个反斜杠替换\\ }。这使得标签和退格以明确的方式可见。

这是我提出的内容,它不会用指定的tab替换\putchar,它只是在它前面添加它(我没有退格,因为我无法真正输入退格......):

这是我阅读代码的方式。我错过了什么?:

"有一些整数cc等于输入。当输入不等于文件结束时继续。如果输入是tab,则输出\t。如果输入为\,则输出\\。将输入输出到控制台。"

int c;

while((c=getchar())!=EOF)
{
    if(c=='\t')
        {
            putchar('\\');
            putchar('t');
        }

    if(c=='\\')
        {
            putchar('\\');
            putchar('\\');
        }
    putchar(c);
}

6 个答案:

答案 0 :(得分:6)

您的主要问题是无论您是否已输出其翻译,您都在输出该字符。那些if语句将按照您的预期进行,但是,就目前的形式而言,它们只是直接进入下一个语句。

因此,您正在寻找更像这样的东西:

while ((c = getchar()) != EOF) {
    // Detect/translate special characters.

    if (c == '\t') {
        putchar ('\\');
        putchar ('t');
        continue;              // Go get next character.
    }

    if (c == '\b') {
        putchar ('\\');
        putchar ('b');
        continue;              // Go get next character.
    }

    if (c == '\\') {
        putchar ('\\');
        putchar ('\\');
        continue;              // Go get next character.
    }

    // Non-special, just echo it.

    putchar (c);
}

另一种可能性,更简洁,更简洁:

while ((c = getchar()) != EOF) {
    // Detect/translate special characters, otherwise output as is.

    switch (c) {
        case '\t': putchar ('\\'); putchar ('t');  break;
        case '\b': putchar ('\\'); putchar ('b');  break;
        case '\\': putchar ('\\'); putchar ('\\'); break;
        default:   putchar (c);
    }
}

答案 1 :(得分:2)

我知道我迟到了,但是在elsecasecontinue之前的第一章中会出现这个问题,并且介绍了函数。

这是练习1-10的有效解决方案,仅涉及到练习点所介绍的概念。您需要跟踪是否找到转义字符,然后仅在找不到复制字符时才显示复制字符。

#include <stdio.h>

int main() {

  int input;

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

    int escaped = 0;

    if(input == '\t'){
        putchar('\\');
        putchar('t');
        escaped = 1;
    }

    if(input == '\b'){
        putchar('\\');
        putchar('b');
        escaped = 1;
    }

    if(input == '\\'){
        putchar('\\');
        putchar('\\');
        escaped = 1;
    }

    if(escaped == 0){
      putchar(input);
    }
  }
}

答案 2 :(得分:1)

添加另一个解决方案!方便我们新手丰富我们,看到各种解决方案。

#include <stdio.h>

/* a program to copy its input to its output, replacing tab by \t,
    backspace by \b, backslash by \\  */
    
/* need double backslash to output a single backslash */

int main(){
    
    int c;          /*  to store next character from getchar() */
        
    while((c = getchar()) != EOF){
        if( c != '\t' && c != '\b' && c != '\\')        /* print all characters except special one's */
            putchar(c);                             
            
        else{
            if(c == '\t'){          /* replacing tab by \t */
                putchar('\\');
                putchar('t');
                }
            
            if(c == '\b'){          /* replace backspace by \b */ 
                putchar('\\');
                putchar('b');
                }
                
            if(c == '\\'){          /* replace backslash by \\ */
                putchar('\\');
                putchar('\\');
                }       
        }
        
    }

}

答案 3 :(得分:0)

有很多方法可以实现这一点,而paxdiablo给出了一些好的方法。这是一个用DRY principle来说明functional decomposition

void putesc(char c)
{
    putchar('\\');
    putchar(c);
}

void ioloop(void)
{
      for (int c;;)
          switch (c = getchar())
          {
               case EOF:  return;
               case '\t': putesc('t'); break;
               case '\b': putesc('b'); break;
               case '\\': putesc(c); break;
               default:   putchar(c); break;
          }
 }

答案 4 :(得分:0)

在练习之前,本书提到了ASCII代码而不是更高级的语句。因此,我认为解决方案的目标是使用ASCII。

    int c;
    while ( (c = getchar()) != EOF ){
        //92 is the ASCII code for the backslash \
        if ( c == '\t'){
            putchar(92);
            putchar('t');
        }else if ( c == '\\' ) {
            putchar(92);
            putchar(92);
        }else if ( c == '\b' ) {
            putchar(92);
            putchar('b');
        }else{
            putchar(c);
        }
    }

答案 5 :(得分:-1)

您非常亲密。只需将每个块中的第二个“ putchar()”更改为赋值语句,即可获得正确的输出。

int c;

while((c=getchar())!=EOF)
{
    if(c=='\t')
        {
            putchar('\\');
            c = 't';
        }

    if(c=='\\')
        {
            putchar('\\');
            c = '\\';
        }
    putchar(c);
}