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

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

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

这是我提出的,它没有替换tab\用指示的putchar ,它只是将它添加到它前面。(我没有做退格,因为我无法真正输入退格…) :

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

“有一些整数c等于输入。当输入不等于文件结束时继续。如果输入是tab然后输出\t 。如果输入是\则输出\\ 。输入输入到控制台“。

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

您的主要问题是无论您是否已输出其翻译,您都在输出该字符。 那些if语句将按照你的期望行事,但就目前的forms而言,它们只是简单地进入下一个陈述。

因此,你会寻找更像这样的东西:

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

我知道我迟到了,但是在第一章中出现了这个问题,然后介绍了casecontinue和函数。

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

 #include  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); } } } 

有很多方法可以实现这一点,paxdiablo给出了一些好的方法。 这是通过function分解说明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; } } 

在练习之前,本书提到了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); } }