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

问题描述 投票:0回答:9

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

提示: 编写一个程序将其输入复制到输出,用

\t
替换每个制表符,用
\b
替换每个退格键,用
\\
替换每个反斜杠。这使得制表符和退格键以明确的方式可见。

这就是我的想法,它不会用指示的

tab
替换
\
putchar
,它只是将其添加在它前面。(我没有执行退格键,因为我真的不能输入退格键...):

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

“有一些整数

c
c
等于输入。当输入不等于文件末尾时继续。如果输入是制表符,则输出
\t
。如果输入是
\
,则输出
\\
。将输入输出到控制台。”

int c;

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

    if(c=='\\')
        {
            putchar('\\');
            putchar('\\');
        }
    putchar(c);
}
c getchar putchar
9个回答
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);
    }
}

4
投票

我知道我来晚了,但是这个问题在第一章就出现了

else
case
continue
,并且介绍了功能。

这是练习 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);
    }
  }
}

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;
          }
 }

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('\\');
                }       
        }
        
    }

}

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();  
    }
}

0
投票

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

int c;

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

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

0
投票
    #include <stdio.h>

    int main(int argc, const char * argv[]) {
    
        int c;
        int tab = 't';
        int backspace = 'b';
        int backslash = '\\';

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

            if (c == '\t'){
                putchar('\\');
                putchar(tab);
            }
            else if(c == '\b'){
                putchar('\\');
                putchar(backspace);
            }
            else if(c == '\\'){
                putchar('\\');
                putchar(backslash);
            }
            else{  // All other characters EXCLUDING "tab, backspace and backslash"
                  // will always be printed.
                putchar(c);
            }
        }

       return 0;
   }

0
投票
        int c;

    printf("Replace tabs, backspaces and backslashes with escape sequences while typing text\n");
    printf("Press Enter to stop:\n");

    struct termios oldt, newt;
    tcgetattr(STDIN_FILENO, &oldt);
    newt = oldt;
    newt.c_lflag &= ~(ICANON | ECHO);
    tcsetattr(STDIN_FILENO, TCSANOW, &newt);

    while ((c = getchar()) != EOF && (c != '\n'))
    {
        switch (c)
        {
        case '\t':
            printf("\\t");
            break;
        case 127:  // ASCII value for backspace
            printf("\\b");
            break;
        case '\\':
            printf("\\\\");
            break;
        default:
            putchar(c);
        }
    }

    printf("\nThank you for trying it out!\n");

    tcsetattr(STDIN_FILENO, TCSANOW, &oldt); 

    return 0;

-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);
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.