读入输入,然后读入c编程中的每个字符

时间:2016-09-24 20:53:58

标签: c eof c-strings

我正在通过我的教科书kernigan和ritchie研究练习题(再次练习,而不是学分)。

该问题表明编写一个程序,在其输入中打印单词长度的直方图。

我想通过为我读过的每个字符打印一个“_”来做到这一点。但是,我在阅读字符时遇到了很多麻烦。

现在,我的程序看起来像这样:

int main(){

int c;
char str[100];
scanf("%s", str);
printf("|");
while((c = getchar()) != EOF){
        putchar(c);
        printf("_");
    }

printf("|");
return 0;

}

主要编译。但是,当我尝试使用它并给它一个单词(任何长度)时,它只是打印: | _

然后光标向下移动到下划线旁边。我究竟做错了什么?为什么在“|”之后打印下划线而不是旁边,因为我没有使用\ n?

1 个答案:

答案 0 :(得分:0)

您看到的输出是因为scanf("%s",str)行将您输入的单词捕获到默认分隔符字符(即空格),然后继续打印' | '然后,字符尝试从标准输入读取更多内容。

如果你输入了说mylong字你喜欢吗?然后ctrl-z

你会看到:

| _w_o_r_d_ _d_o_ _y_o_u_ _l_i_k_e_ _i_t _?_ _ ^ Z |

这是因为你喜欢这个人物字吗?仍然在要处理的流中。

如果您只输入一个没有空格的单词,那么您将看到您观察到的内容。

这两行:

char str[100];
scanf("%s", str);

可以删除,然后你就不会抓住这个词,也不会做任何事情。

或者,如果你想使用scanf,你可以这样改变:

#include <stdio.h>

int main(){
    char str[100];
    char* p = str;
    scanf("%s", str);
    printf("|");
    while (*p != NULL) {
        putchar(*p++);
        printf("_");
    }
    printf("|");
    return 0;
}

此代码打印str中的每个字符,散布着_字符。