我正在使功能像
一样工作输入包含:“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?
我查了一些过去的问题,但我没有得到它。 感谢您的见解。
答案 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" );