getchar()在C

时间:2018-02-06 19:31:30

标签: c

我正在使功能像

一样工作

输入包含:“1 2 3 4 5 6 7 8 9 10 \ n”

功能输出:“{1,2,3,4,5,6,7,8,9,10} \ n”

我想看看getchar()是如何工作的,所以我写了这样的函数:

    int c ;

    printf("{");

    while ((c = getchar()) != EOF) {
            printf("%c, ", c);
            getchar();

    }
    getchar();
    printf("}\n");

当我把“1 2 3 4 5 6 7 8 9 10 \ n”时,它就像:

{1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 
 , }

我觉得里面的缓冲区有问题。也许getchar()逐个字符地读出和输出,以便10分别被认为是1和0?

我查了一些过去的问题,但我没有得到它。 感谢您的见解。

2 个答案:

答案 0 :(得分:6)

是的,你是对的 - 令人惊讶地它的名字就是这样 - 它逐个字符地输入。这里MICEData是一个字符, class Monster { public: virtual void describe() {}; }; class Skeleton : public Monster { public: Skeleton() { } ~Skeleton(){} void describe() override { std::cout << "I am skeleton" << std::endl; } }; class Zombie : public Monster { public: Zombie(){} ~Zombie(){} void describe() override { std::cout << "I am Zombie" << std::endl; } }; int main(void) { std::vector<Monster> potwory; potwory.push_back(Skeleton()); potwory.push_back(Zombie()); Skeleton sz; Zombie z; potwory.push_back(sz); potwory.push_back(z); for (auto i = 0; i < potwory.size(); i++) { std::cout << typeid(potwory[i]).name() << std::endl; // each of them is Monster object potwory[i].describe(); //here is calling method from base class , I want derived method. } std::cin.get(); return 0; }` 是另一个字符。

还有不同的方法可以处理这个问题 - 你可以从这些角色自己形成数字(每当你看到一个空间,你会知道你已经看过一个数字并且可能跳过多个空格)或者在一段时间,然后使用'1'以空格分隔数字,然后使用'0'转换它们。

答案 1 :(得分:1)

输入流是一系列字符 - 不是整数,不是浮点数,不是字符串,只是字符。当您键入1 2 10之类的内容时,输入到输入流的内容是字符序列{'1', ' ', '2', ' ', '1', '0', '\n' }getchar只是从该字符序列中读取下一个字符。

请注意,在您的循环中,您需要调用getchar 两次并丢弃所有其他输入,这就是结尾0无法显示的原因起来。

如果您想将解释字符序列'1' '0'作为整数值10,那么您需要缓冲这些字符并将它们转换为您自己使用整数值,或将scanf%d转化说明符一起使用:

int value;

putchar( '{' );
while ( scanf( "%d", &value ) == 1 )
  printf( "%d, ", value );
printf( "}\n" );