在C中使用getchar()函数苦苦挣扎

时间:2013-07-12 11:27:56

标签: c++ c string input 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或类似单词,它就有效。

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

getchar会返回int,而不是char,因为它必须能够 返回一个超出char的值。它是 将结果分配给char的编程错误,因为您 松散的关键信息。取决于是否char 已签名或未签名,在分配后检查EOF 它对char来说意味着你永远找不到EOF(平原 char无符号),或输入中的某个字符(ÿ in 拉丁语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。)

答案 2 :(得分: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()的结果直接分配给char,否则将字节读取与EOF进行比较可能会导致为true,尽管您尚未到达文件末尾然而。