8

我已经为此工作了 2 个小时,但我被困住了……我在网上找到了答案,但这并不能帮助我了解我显然遗漏的概念。

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

这是我想出的,它不会替换 a tabor\与指定的putchar,它只是在它前面添加它。(我没有做退格,因为我不能真正输入退格......):

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

“有一些整数cc等于输入。当输入不等于文件结尾时继续。如果输入是制表符,则输出\t。如果输入是\输出\\。将输入输出到控制台。”

int c;

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

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

7 回答 7

9

您的主要问题是您正在输出字符,而不管您可能已经输出了它的翻译。这些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);
    }
}
于 2014-04-07T04:09:41.883 回答
3

我知道我来晚了,但是这个问题在第一章之前就出现了,,,,并else介绍了函数。casecontinue

这是练习 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);
    }
  }
}
于 2017-11-14T06:56:40.363 回答
1

有很多方法可以实现这一点,paxdiablo 提供了一些很好的方法。这是通过功能分解说明DRY 原则的一个:

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;
          }
 }
于 2014-04-07T06:06:34.970 回答
1

我是菜鸟。但只考虑到那时他们教的东西,我想出了这个答案。

#include <stdio.h>

main() 
{
    int c;

    c = getchar();

    while (c != EOF) {
        if (c == '\t') {
            putchar('\\');
            putchar('t');
        }
        else if (c == '\b') {
            putchar('\\');
            putchar('b');
        }
        else if (c == '\\') {
            putchar('\\');
            putchar('\\');
        }
        else {
            putchar(c);
        }  
        c = getchar();  
    }
}
于 2022-02-20T09:32:53.890 回答
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('\\');
                }       
        }
        
    }

}
于 2021-07-20T16:20:55.420 回答
0

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

int c;

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

    if(c=='\\')
        {
            putchar('\\');
            c = '\\';
        }
    putchar(c);
}
于 2019-10-17T06:01:25.647 回答
-2

就在练习之前,本书提到了 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);
        }
    }
于 2018-03-21T05:02:17.697 回答