我已经在这工作了2个小时而且我被卡住了...我在网上找到了答案,但这并不能帮助我学习我明显遗漏的概念
提示:编写程序将其输入复制到其输出,将每个选项卡替换为\t
,每个退格键替换\b
,每个反斜杠替换\\
}。这使得标签和退格以明确的方式可见。
这是我提出的内容,它不会用指定的tab
替换\
或putchar
,它只是在它前面添加它(我没有退格,因为我无法真正输入退格......):
这是我阅读代码的方式。我错过了什么?:
"有一些整数c
。 c
等于输入。当输入不等于文件结束时继续。如果输入是tab,则输出\t
。如果输入为\
,则输出\\
。将输入输出到控制台。"
int c;
while((c=getchar())!=EOF)
{
if(c=='\t')
{
putchar('\\');
putchar('t');
}
if(c=='\\')
{
putchar('\\');
putchar('\\');
}
putchar(c);
}
答案 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)
我知道我迟到了,但是在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);
}
}
}
答案 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);
}