2013-07-12 48 views
-1

我试图用一个空白替换多个空格。用C中的getchar()函数挣扎

#include <stdio.h> 
#include <stdlib.h> 
#define MAXLINE 500 

main() { 
    char text[MAXLINE]; 
    int i; 

    for(i = 0; (text[i] = getchar()) != EOF && text[i] != 'x'; i++) { 
     if(text[i] == ' ') 
      i++; 

     while((text[i] = getchar()) != EOF && text[i] != 'x' && text[i] == ' '); 

     if(text[i] == EOF || text[i] == 'x') 
      break; 
    } 

    text[i] = '\0'; 

    printf("\n\n-- Result --\n%s", text); 
} 

我知道getchar()需要一个字符enter按下该按钮之后,但我已经见过很多次,人们如何使用它,直到EOF发现让整个字符串。即使在这个例子中,如果我注释掉while循环(如果我写一个没有空白的单词,我会得到一个正确的字符串),它就可以工作。我想要的是将一个人写入数组中的每个字符。在这种情况下,getchar()功能可以使用吗?如果是的话,我需要在这段代码中进行修改才能使它工作,因为现在它只打印一些字符(如果while循环未被注释掉)?正如我所说,如果我写一个字apple或类似的没有任何空白和没有while循环,它的工作原理。

+0

请注意'main()'应该(必须)返回'int'。你应该测试溢出('我 Kninnug

+0

谢谢。一旦我完成了目前的问题,我会解决这些问题。 – Stein

+1

还要注意'getchar()',尽管它是非常通信的名称,[不会*返回一个'char'](http://linux.die.net/man/3/getchar)(因为'EOF'确实不适合字符)。 – unwind

回答

0

要读取所有来自用户的输入,直到输入结束为止,可以使用类似的方法滑行多次出现的空格。

#include <stdio.h> 
#include <stdlib.h> 
#define MAXLINE 500 

int main() { 
    char text[MAXLINE]; 
    int i; 
    int c; 

    c = getchar(); 
    for (i = 0; c != EOF && i < MAXLINE-1; ++i) { 
     text[i] = c; 

     if (c != ' ') { 
      c = getchar(); 
     } else { 
      while (c == ' ') 
       c = getchar(); 
     } 
    } 
    text[i] = '\0'; 

    printf("\n\n-- Result --\n%s", text); 
} 
+0

谢谢。我在执行getchar时犯了什么错误? – Stein

+0

@decas您将结果分配给一个'char'。在一个8位字节的典型实现中,'getchar'具有257个不同的可能的返回值,所以结果不会无损于'char'。 –

+0

在你的代码中,只有当空间出现时才增加'i',所以我可以打赌,你会得到每个单词的第一个字符的数组。并且在'char'中存储'getchar()'的结果也是错误的。 –

0

getchar返回int,而不是一个char,因为它必须能够 返回超过可容纳在一个char更多的价值。这是 出现编程错误将结果分配给char,因为您的 宽松了关键信息。根据是否平原char 带有符号,具有分配 到一个字符后检查EOF意味着你永远无法找到EOF(普通 char无符号),或在输入(ÿ某个字符 拉丁1通常)将被视为EOF

在C++中,相当于是std::cin.get(),但我们更 一般写类似:

for (int i = 0; 
     i < sizeof(text) && std::cin.get(text[i]) && text[i] != 'x'; 
     ++ i) { 
    // ... 
} 

(当然,在C++中,我们会最有可能使用的std :: string,与 。只是一个单一的charint为输入)

在C(因为它看起来像这就是你实际使用的), 你需要一个额外的中间变量:

int ch; 
for (int i = 0; 
     i < sizeof(text) && (ch = getchar()) != EOF && ch != 'x'; 
     ++ i) { 
    text[i] = ch; 
    // ... 
} 

请注意,在这两种语言中,都需要将边界检查作为 的第一个条件。 (在C++中,如果您使用的是 std::string,则不需要它。)

+0

是的,我没有记住'EOF'是-1,我正在使用字符。 – Stein

+0

@decas'EOF' is _usually_ -1。所有需要的是它是负的(并且'getchar'返回'EOF'或者范围为[[0 ... UCHAR_MAX]'的值)。 –

0

您的while循环读取时不会增加i。所以读取的所有字符实际上都被丢弃了,因为它们被下一个循环覆盖。如果它仅仅到一个空白替代多个空白,你可能会做这样的事情

char text[1024]; 
int i; 
int c; 

for(i = 0; i < sizeof(text)-1 && (c = getchar()) != EOF && c != 'x';) { 
    if(c != ' ' || i == 0 || text[i-1] != ' ') 
      text[i++] = c; 
} 

正如评论已经statetd:不要直接的getchar()结果直接分配到一个字符,否则比较读取到字节尽管您尚未到达文件结尾,但EOF可能会导致错误。

+0

是的,我扔掉空白,因为我只需要一个。 – Stein

+0

然后,该代码应该是适当的 –