0

这是一个 K&R 练习。它应该用一个空格代替双倍或更多。相反,它完全反映了输入、空间和所有内容。另外,为什么我必须在其他练习中使用 EOF (ctrl-d) 而在这个练习中使用 RETURN (Enter)?(我在 Ubuntu 上运行它,但在 mac 上使用 ssh。)

 #include <stdio.h>

 main()
 {

   int c;

   c = getchar();

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

4 回答 4

3

显示的片段有 [至少] 一个逻辑错误和另一个错误,这是由于逻辑布尔运算符和按位布尔运算符之间的混淆而导致的。

逻辑错误

您的第二个测试c != EOF是 OR-ed,而字符测试不是空格(c != ' ')...由于您在 c 不是 EOF 时进行此 OR-ed 测试(这是 的控制条件 while),所以 OR-ed 测试永远是真的!

   ...
   while (c != EOF)
     {
       // This test always true regardless of c being a space or not
       // Also it should be a logical OR, if at all.  The bitwise OR will produce
       // odd results if you are not sure of the bit patterns of the operands.
       while (c != EOF | c != ' ')  
         {
           putchar(c);
           c = getchar();
         }
     ...

运算符错误的混淆:在这种情况下,您需要使用逻辑或(或实际上是逻辑与)运算符,即||&&分别而不是按位布尔运算符(|&)。

您通常会发现,在 C 语言中,您经常使用逻辑运算符来表示布尔条件,因此,当您实际上需要处理变量的位模式时(例如,屏蔽某些位或强制它们成为设置等)

现在,上面是“按原样”解决代码中的问题,只是解释了为什么要像处理其他字符一样处理空格......关于 K&R 练习的目标:用一个空格替换几个空格的序列,显示的逻辑是肯定错误的。我不想在这里放弃它,但有一些提示:

  • 引入一个“状态”变量,指示前一个字符是否为空格
  • 使用单个 while 循环(而不是 EOF 或您希望的任何结束条件)
  • 在循环内系统地输出读取的字符,除非设置了状态变量
  • 有条件地输出当前字符后,更新状态字符。

作为一般提示,需要在循环中重复循环结束条件和/或引入您从某些输入中读取的多个点(此处为 multiple getchar()

于 2013-03-08T06:02:49.553 回答
1

您的代码有两个问题。

第一个是您尝试使用逻辑或运算符 (||),但您使用的是按位或 (|)。第二个是你应该使用逻辑与而不是逻辑或,无论如何:

while (c != EOF && c != ' ')
于 2013-03-08T06:06:09.100 回答
1

试试这个循环:

   while (c != EOF)
     {
       if (c == ' ')
         {
           putchar(c);
           while(c == ' ' && c != EOF)
             c = getchar();
         }
       else
         {
           if (c != EOF)
             putchar(c);
           c = getchar();
         }
     }
于 2013-03-08T06:08:43.423 回答
0

这是很多获取和放置,以及值的检查。这里有一些更清洁的东西,也可以处理标签。

void main (void)
{
int F_space=F_tab=0;    // Flags for special chars
char ch;
do
    {
    ch = getchar();

    // test for special characters
    switch (ch)
        {
        case ' ':   // space
            F_space = 1;
            continue;

        case '\t':  // tab
            F_tab = 1;
            continue;

        default:    // anything else
            // output a space if necessary
            if (F_space || F_tab) {
                F_space = F_tab = 0;    // clear flags
                putchar (' ');
            }
            break;
        }

    // output the character
    putchar (ch);
    break;
    } 
while (ch != EOF);
于 2014-06-26T23:44:10.990 回答