在 C++ 中输入类型为 char 的变量的数字

Input number to variable with type char in C++

提问人: 提问时间:8/2/2022 最后编辑:digito_evo 更新时间:8/6/2022 访问量:408

问:

在 C++ 中,如何向变量输入数字?在 C 中,我可以使用格式说明符接受输入:unsigned char%hhu

unsigned char var_name;
scanf("%hhu", &var_name);
//lets say I inputted 27
printf("%hhu", var_name);
//the output is 27

如何在 C++ 中做到这一点?下面的代码是我尝试在 C++ 中执行此操作的,但它做了错误的事情。如何在 C++ 中编写等效代码?

unsigned char var_name;
std::cin >> var_name;
//Input 27 again
std::cout << var_name;
//The output is just 2, how can I make the '7' appear?
C++ IOstream CIN

评论

2赞 463035818_is_not_an_ai 8/2/2022
与任何其他变量相同std::cin >> var_name;
0赞 8/2/2022
但是,如果我在该变量中输入 12(基本上是任何超过一位数字的数字),那么我打印该值,它只打印我输入的值的第一个数字(在本例中为 1)。为什么?
0赞 molbdnilo 8/2/2022
@manungsa 因为读一个字就是读一个字,一个数字就是一个字。char
1赞 hyde 8/2/2022
事实上,我认为这在 C++ 中并非易事,如果希望能够从变量中读取整数......可能需要一个帮助程序类。std::istreamunsigned char
2赞 hyde 8/2/2022
@phuclv 这个问题下的答案都没有真正提供解决方案,他们只是解释了发生了什么。所以它不是一个很好的重复候选者。

答:

0赞 Guy Lawrence-Downs 8/2/2022 #1

由于 cin,打印变量时只得到 2。

C++ 中无符号字符的最大大小通常为 8 位,这对于任何实际字符和最多 255 的任何数字都很好。但是,这个数字取决于编译器和系统。可以存储的最大值位于标头中,如UCHAR_MAX所示。

您在这里的问题是您使用的是 cin,如果它将输入存储为字符,它只会读取输入的第一个“字符”。有几种方法可以解决这个问题,包括将输入作为整数,然后转换为字符,或者让您的程序使用整数。

希望这对:)有所帮助

评论

0赞 hyde 8/2/2022
代码未按预期工作。期望是打印,它只是打印。这里的“预期”有两个含义,重要的一个是,需求所期望的是什么(与上面的 C 代码输出相同)。272
0赞 Guy Lawrence-Downs 8/2/2022
对不起,我会把它改:)
0赞 hyde 8/2/2022 #2

发生这种情况是因为在读取 from 时,会读取一个字符。这就是发生的事情,这就是工作方式。这也很有道理,因为想要阅读一个字符是很常见的。unsigned charstd::istreamstd::istream

简单的解决方案是使用临时变量:

unsigned char var_name;
unsigned int tmp;
std::cin >> tmp; // input 27
// optionally add checking that tmp is small enough
var_name = tmp; // truncation of unsigned ints is well defined
std::cout << var_name; // should print 27

评论

0赞 hyde 8/2/2022
一个更有趣的解决方案是编写一个包装器,如 ,这将允许做 .template <typename T> class as_number { ....std::cin >> as_number{tmp};
0赞 Andreas Wenzel 8/2/2022 #3

当是类型时,则行var_nameunsigned char

std::cin >> var_name;

类似于

std::scanf("%c", &var_name);

即 C++ 将假设您要读取单个字符并将字符代码写入 .var_name

如果要读取一个数字并将该数字写入 ,则不能使用数据类型,或者在使用 时,即使数据类型在技术上能够表示所需的值范围。相反,您首先必须使用具有较大数据类型的变量(例如 )来读取数字。之后,您可以将其分配给另一个类型的变量:var_namecharunsigned charoperator >>unsigned shortunsigned char

unsigned char var_name;
unsigned short temp;

std::cin >> temp;

if ( std::cin )
{
    var_name = static_cast<unsigned char>( temp );
    std::cout << var_name << '\n';
}
else
{
    //TODO: handle error
}

这不是必需的,但某些编译器可能会由于截断而发出警告,这可能会被强制转换抑制。此外,使用强制转换使代码更具可读性,因为很明显该值被截断了。static_cast

但是,我通常不建议您用于用户输入,因为它会做一些奇怪的事情,例如operator >>

  • 并不总是一次读取一行输入,并且
  • 接受垃圾,例如作为数字的有效输入,尽管在这种情况下可能应该拒绝输入。"6sdfj23jlj"6

如果你想通过正确的输入验证从用户那里读取一个数字,我建议你看看我的这个答案中的函数。get_int_from_user