【问题标题】:Putchar, getchar, missing character in while loopPutchar、getchar、while 循环中缺少字符
【发布时间】:2012-03-14 10:35:03
【问题描述】:

我对这种和平的代码有问题,它应该将小写字母变为大写字母,并将多个空格变为一个空格。所以它做错了什么,它以某种方式切断了第一个字母,就像我写“abcdefg”时它在输出“BCDEFG”上给了我一样。

main(){ 
int z=0,b;  

        while ( (b = getchar() ) != '\n')
        { 
        b=b-32;
            if (b>0)
            { 
                putchar(b);
            }
            else 
            {
                if (z>=2)
                { 
                    putchar(b);
                }
                else
                { 
                    z=z+1;
                    printf(" ");
                }
            }


        }
}

【问题讨论】:

    标签: c while-loop getchar putchar


    【解决方案1】:

    它似乎为我生成了所有字母...您是否尝试过跟踪它,以了解它在每个步骤中使用您输入的字符在做什么?

    【讨论】:

    • 哇,我不知道如何,但现在它也可以正常工作了,无论如何,谢谢。
    【解决方案2】:

    您的空白处理有一些问题。

    看来您无论如何都会打印一个空格(当您的 getchar 返回 0x20 时)。

    【讨论】:

      【解决方案3】:

      您可以从这里开始以消除您的空间问题。 否则你有一个特别有问题的输入。因为我没有“首字母剪切”问题。

      main(){ 
      int z=1,b;  
      
              while ( (b = getchar() ) != '\n')
              { 
              b=b-32;
                  if (b>0)
                  { 
                      putchar(b);
                      z=1;
                  }
                  else 
                  {
                      if (z>=2)
                      { 
                          putchar(b);
                      }
                      else
                      { 
                          z=z+1;
                          printf(" ");
                      }
                  }
      
      
              }
      }
      

      【讨论】:

        【解决方案4】:

        首先,您不应该使用像“32”这样的常量,而是让系统定义值是什么。即:b -= char(' ');

        其次,去看看函数“islower()”和“toupper()”,C 会自动为你做这些。

        考虑这样的事情:

        包括

        主() {

            int     flag = 0;
            char    b;
        
            while ((b=getchar()) != '\n') {
                    if (flag && isspace(b))
                            continue;
                    putchar(toupper(b));
                    if (isspace(b)) {
                            flag = 1;
                            continue;
                    }
                    flag = 0;
            }
            putchar('\n');
        

        }

        输入:“a bc def ghijghg 123 a1b2c3”

        输出:“A BC DEF GHIJGHG 123 A1B2C3”

        注意:看起来文本框正在消除空格,因为输入行中有很多空格。

        您应该始终注意您的边界条件。如果输入开始是一堆空格,它仍然会打印一个空格。要消除所有前导空格,请初始化 flag = 1。如果输入有尾随空格,它还将打印最终空格。要消除这些问题,您需要稍微不同的解决方案,即在看到一个空格和另一个可打印字符后打印一个空格。

        【讨论】:

          猜你喜欢
          • 2021-09-18
          • 2015-06-04
          • 1970-01-01
          • 2021-07-18
          • 2011-02-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多