2016-08-17 66 views
0

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

#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; 

} 
+0

你的意思是用一个空白替换连续的黑色,对不对? –

+0

是的。这似乎不工作@chux。我之前做过类似的事情,但是这使得空白回到0.当写我的名字时,我的名字没有空格 – Thenoobienoob

+2

给出的答案并不坏,但它们不能帮助你理解你的代码有什么问题。如果你是编程新手,学习跟踪代码很重要。因此,有些问题可以帮助您找到* your *代码中的错误,而不是将其替换为别人的代码:如果您的输入是'The ... noobie ..... noob'[[ =空格]?为每个角色手动查看循环。跟踪空白的价值,问问自己什么时候应该做putchar,以及现在做什么时候。当您在单词2和单词3之间时,会出现什么情况? –

回答

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; 
} 
+0

书中还没有isalpha功能呢。刚刚开始,并在第20页。我尝试输入代码,但它似乎并不幸运。 – Thenoobienoob

+0

'isalpha'不等于'not(isspace)',这让我想知道为什么你将这个函数引入noobienoob。 – usr2564301

1

你不需要计算确切的空白数。一旦找到空白的“举起旗帜”即可找到空白。当您再次非空白字符打印空白,把旗回0。另外,插入“继续”在你的代码语句,以避免不必要的检查:

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; 

} 
+0

好的,谢谢你的建设性反馈。它似乎工作,我理解循环的第一部分,但是你能解释一下为什么每次访问非空白字符时都需要添加一个空格? – Thenoobienoob

+0

空白字符被访问的信息保存在空白变量中。当当前字符是非空字符时,将检查空白变量的值。如果它是1,这意味着在当前非空白字符之前至少存在一个空白字符。因此,在打印当前字符值之前,您应该按照任务要求打印空白字符。当然......你也应该将空白找回为0以便识别未来可能出现的空白字符。 –

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。当遇到一个或多个空格时打印。

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

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