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

read in input, then read in each char in c programming

我正在做 kernigan 和 ritchie 教科书中的练习题(同样是为了练习,而不是为了学分)。

问题是编写一个程序,打印输入中单词长度的直方图。

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

现在,我的程序是这样的:

int main(){

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

printf("|");
return 0;

}

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

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

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

如果你进入say mylong的话你喜欢吗?然后 ctrl-z

你会看到:

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

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

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

两行:

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 中的每个字符,中间穿插 _ 字符。