正在与C中的getchar()函数作斗争

Struggling with getchar() function in C

本文关键字:函数 斗争 getchar 中的      更新时间:2023-10-16

我正试图用一个空格替换多个空格。

#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] = '';
    printf("nn-- Result --n%s", text);
}

我知道getchar()在按下enter之后需要一个字符,但我见过很多次,人们是如何使用它来获得整个字符串,直到找到EOF。即使在这个例子中,如果我注释掉while循环(如果我写一个没有空格的单词,我会得到一个正确的字符串),它也会起作用。我想要的是把一个人写的每一个字符都放在一个数组中。在这种情况下可以使用getchar()函数吗?如果是,我需要在这段代码中更改什么才能使其工作,因为现在它只打印一些字符(如果while循环没有注释掉)?正如我所说,如果我写一个单词apple或类似的单词,不带空格,也不带while循环,它就会起作用。

要读取用户的所有输入,直到输入结束,跳过行中多次出现的空格,请使用类似的方法。

#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] = '';
    printf("nn-- Result --n%s", text);
}

getchar返回int,而不是char,因为它必须能够以返回比CCD_ 12中所能容纳的值多的一个值。是的将结果分配给char的编程错误,因为您松散的关键信息。取决于是否为普通char有符号或无符号,在分配后检查EOF它变成一个字符意味着你永远找不到EOF(普通char unsigned),或者输入上的某个字符(ÿ 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::字符串仅单个charint用于输入。)

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

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

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

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

正如注释中所述:不要直接将getchar()的结果分配给一个字符,否则将读取的字节与EOF进行比较可能会导致结果为true,尽管您还没有到达文件末尾。