如何用一个空白替换c编程中的多个空白?

时间:2016-08-17 15:52:27

标签: c kernighan-and-ritchie

我是编程新手,我决定从c开始。我正在使用K& R,还有这个练习,它要求编写一个程序,将输入复制到输出,用一个空格替换一个或多个空格。然而,当我编写我的程序时(我确信它不正确但是没关系,因为我在这里学习)我想知道我做错了什么。还有一个注意事项:当我用3个空白键入我的名字时,它减少到2个,但是当使用两个或一个空白时,没有任何反应。代码发布在下面

#include <stdio.h>
#include <stdlib.h>


int main(void)
{
int c; // getchar value
int blanks = 0; // counting the amount of blanks. If more than one then  replace with blanks_2
char blanks_2 = ' '; //character value for replacement in case blanks is more than one

printf("Enter your name please\n");

while((c = getchar()) != EOF){
if(c == ' '){
    ++blanks;

    if (blanks >= 1){
        putchar(blankos);   }
    }
if(c >= 'a' && c <= 'z'){
    putchar(c);
}
if (c >= 'A' && c <= 'Z'){
    putchar(c);
}

}

return 0;

}

4 个答案:

答案 0 :(得分:1)

我想你正在尝试编写一个程序来获得这样的输入:

John        David       Doe

并将其显示为输出:

John David Doe

删除所有额外的空格。这应该有效:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int c; // getchar value
    int blanks = 0; // counting the amount of blanks. If more than one then  replace with blanks_2

    printf("Enter your name please\n");

    while((c = getchar()) != EOF)
    {
        if(c == ' ')
        {
            // count blanks
            ++blanks;

            if (blanks==1)     
                putchar(c); // display only the 1st blank
        }

        if(isalpha(c))
        {
            putchar(c);
            blanks=0; // reset blanks counter as c is an alpha character
        }
    }

    return 0;
}

答案 1 :(得分:1)

您无需计算空白的确切数量。一旦你找到一个空白&#34;举起一面旗帜&#34;找到空白。当您再次访问非空白字符时,打印一个空白并将标志返回0.此外,插入&#34;继续&#34;代码中的语句,以避免不必要的检查:

int main(void)
{
   int c; // getchar value
   int blankfound = 0;

   printf("Enter your name please\n");

   while((c = getchar()) != EOF){
      if(c == ' '){
         blankfound = 1;
         continue;
      }
      if(c >= 'a' && c <= 'z'){
         if (blankfound == 1)
         {
             putchar(' ');
             blankfound = 0;
         }
         putchar(c);
         continue;
      }
      if (c >= 'A' && c <= 'Z'){
          if (blankfound == 1)
          {
             putchar(' ');
             blankfound = 0;
          }
          putchar(c);
          continue;
      }

 }

return 0;

}

答案 2 :(得分:1)

许多学习者代码分配都基于之前的字符来处理函数的概念。

考虑以下布局

int previous = something();
while ((c =  getchar()) != EOF) {
  do_stuff(previous, c);
  previous = c;
}

对于OP,那将是:如果角色不是空格或前一个角色不是空格,则打印它。

printf("Enter your name please\n");
int previous = 0;
int c;
while((c = getchar()) != EOF) {
  if ((c != ' ') || (previous != ' ')) {
    putchar(' ');
  }
  previous = c;
}

简化算法可以帮助人们看到如下所示的缺陷。出现信件时,blanks不会重置。它会在遇到1个或多个空格时打印。

if(c == ' '){
    ++blanks;

    if (blanks >= 1){
        putchar(blankos);   }
    }
if(c >= 'a' && c <= 'z'){
    putchar(c);
}
if (c >= 'A' && c <= 'Z'){
    putchar(c);
}

答案 3 :(得分:0)

参考前面的章节(仅在'while'和'if'中使用),我的代码如下所示。

#include <stdio.h>

main()
{
    int c;

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