练习1.9的K& R书

时间:2015-07-21 14:51:07

标签: c

我正在尝试解决K& R书第2版的练习1.9,我将在这里写下练习,然后解释我认为我需要做什么,然后,我的代码和我的疑惑。

练习:

编写一个程序将其输入复制到其输出中,用一个空格替换一个或多个空格的每个字符串。

据我所知,我需要使用之前章节中学到的内容制作程序。

我的观点是,我需要找到一种方法,用C的语言说,当出现多个空白后跟另一个空白时,它会给我一个只有一个空白的短语。但我怎么能对电脑说呢?

#include <stdio.h>
/* ToDo - make a program where when the user input a phrase or
 * something that contains more than one blank followed by another
 * it will transform the input with only one blank */
int main()
{
    int c, b;
    b = ' ';        
    while ((c = getchar()) != EOF){ /*don't need explanation*/
        /*my doubts start here , how can i say more than one blank ?*/
        /* or how can i say if the getchar has  one blank followed by another ?*/

        if (c == +b) /* trying to say if the getchar has more than one blank but i think this is not correct*/
            c = b;   /*then it will turn in only one blank*/        
    }
    putchar(c);         
}

7 个答案:

答案 0 :(得分:2)

这个想法是这样的:

伪代码:

while ((c = getchar()) != EOF)
{
   // c contains the character we've just read

   if (c is blank and the previous read char is blank)
   {
     // do nothing
     continue;
   }

   putchar(c);   // print that char

   copy c to previous char
}

答案 1 :(得分:1)

打印你遇到的每一个角色,包括空白,但当你遇到一个空白时,什么都不做,直到遇到非空白,然后打印出来。重复直到EOF。

在ANSI C中:

#include <stdio.h>

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

输入和输出示例:

asd          asd            2
asd asd 2
Hello         I AM           space
Hello I AM space

答案 2 :(得分:1)

老问题,但因为我刚刚解决了这个练习,我想在这里分享它:

#include <stdio.h>

int
main()
{
        int c, nspaces;

        nspaces = 0;
        c = getchar();

        while(c != EOF) {
                if (c == ' ') {
                        if (nspaces > 0) {
                                ++nspaces;
                        } else {
                                putchar(c);
                                ++nspaces;
                        }
                } else {
                        putchar(c);
                        nspaces = 0;
                }
                c = getchar();
        }

        return(0);
}

对于我的解决方案,我只有一个计数器,可以跟踪找到多少个连续的空白字符。仅当nspaces为0时,才会将c打印回终端。查找非空格字符会将n空间重置为0.使用此方法无需跟踪前一个字符或多次调用getchar()。

答案 3 :(得分:1)

这是Jabberwocky伪代码的实现。如果您尝试自己实现Jabberwocky的伪代码,请阅读,因为它可以带来更好的学习体验:

#include <stdio.h>

int main()
{
    int c, p;
    while ((c = getchar()) != EOF) 
    {
        if (c == ' ' && p == ' ')
        {
            continue;
        }
        putchar(c);
        p = c; /* copy to c to p to track previous character */
    }
    return 0;
}

答案 4 :(得分:0)

好。如果我错了,请纠正我

&#34; ex)编写一个程序将其输入复制到其输出中,用一个空格替换一个或多个空格的每个字符串。&#34;

据我了解,你必须: - 获取输入

如果有多个空白(可以是空格,&#39; \ t&#39;或其他任何人,ascii),则清除输入

- 打印已清除的字符串

-return

我不会解释如何接受输入,只使用main的参数。

然后你必须检查空白。

只需将计数器递增到第一个空白位置,然后检查下一个是否为空白。 如果是,只需保持递增,如果不是,则将char复制到新的char *。

返回那个char *(请不要在一个函数中完成这一切)。

打印出来。

返回0。

答案 5 :(得分:0)

#include<stdio.h>

int main(int argc, char* argv[])
{
    char c = 0;
    char  prevchar = 0;

    while((c = getchar()) != '\n')
    {
        if(c != ' ' || prevchar != ' ')
            putchar(c);
        prevchar = c;
    }
}

这样做:声明第二个var作为排序单个字符缓冲区来检查前一个字符是否是空格。然后if确保putchar只有在它们不是空格时才会触发。您可以将'\ n'更改为EOF我在这里使用'\ n',因此它只会在下次返回时读取。

答案 6 :(得分:0)

#include<stdio.h>
int main()
{
    int i,nb=0;
    char sent[100];

    printf("Enter a sentence: ");

    for(i=0;(sent[i]=getchar())!='\n';i++)
    {
        if(sent[i]==' ')
        {
            nb++;
            if(nb>=2)
            {
                i--; 
                nb--;
            }
        }
        if(sent[i]!=' ')
        nb=0;
    }

    sent[i]='\0';

    printf("\nResult: ");

    for(i=0;sent[i]!='\0';i++)
    {
        putchar(sent[i]);
    }

    return 0;
}

回答同样的问题,我没有使用EOF就这样做了。特别是对于无法使用Ctrl + D&#39;。

的移动用户