-1

I am trying to replace multiple blanks with a single blank.

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

I know that getchar() expects a character after enter was pressed, but I have seen many times, how people use it to get a whole string till EOF is found. Even in this example, it works if I comment out the while loop (I get a correct string if I write a single word without blanks). What I want is to put every single char that a person writes in an array. Is getchar() function okay to use in this case? If yes, what do I need to change in this code to make it work, because now it prints only some characters (if the while loop is not commented out)? As I said, it works if I write a word apple or similar without any blanks and without the while loop.

4

3 回答 3

0

getchar返回 an int,而不是 a char,因为它必须能够返回一个比 a 容纳的值多一个的值char。将结果分配给 a 是一个编程错误char,因为您丢失了关键信息。根据 plainchar 是有符号还是无符号,在将其分配给 char 之后进行检查EOF将意味着您永远找不到EOF(plain charunsigned),或者输入中的某个字符(ÿ通常在拉丁语 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,只有一个charorint作为输入。)

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

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

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

于 2013-07-12T11:51:34.547 回答
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;
}

正如评论中已经说明的那样:不要直接将结果直接分配给getchar()char,否则将读取的字节与 EOF 进行比较可能会导致结果为真,尽管您尚未到达文件末尾。

于 2013-07-12T11:51:47.850 回答
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);
}
于 2013-07-12T11:48:26.243 回答