我已经为此工作了 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);
}
您的主要问题是您正在输出字符,而不管您可能已经输出了其翻译。这些
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);
}
}
我知道我来晚了,但是这个问题在第一章就出现了
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);
}
}
}
有很多方法可以实现这一点,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;
}
}
添加另一个解决方案!对于我们新手来说,看到各种解决方案很方便,可以丰富我们的知识。
#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('\\');
}
}
}
}
我是菜鸟。但仅考虑到他们到目前为止所教的内容,我就得出了这个答案。
#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();
}
}
你们非常接近。只需将每个块中的第二个“putchar()”更改为赋值语句即可获得正确的输出。
int c;
while((c=getchar())!=EOF)
{
if(c=='\t')
{
putchar('\\');
c = 't';
}
if(c=='\\')
{
putchar('\\');
c = '\\';
}
putchar(c);
}
#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;
}
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;
就在练习之前,本书提到了 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);
}
}