我正在尝试向用户询问输入,将该输入设置为unsigned char,然后将其打印出来。例如,输入将询问我“输入x:”并输入0xABCD作为输入。我还需要打印出“0xABCD”。
这是我到目前为止所拥有的:
unsigned char x;
printf("Input x:");
scanf("%s, &x);
printf("%u", x);
它给我0而不是0xABCD。
我做错了什么?
答案 0 :(得分:1)
您需要使用"%hhu"
作为格式说明符来阅读unsigned char
。请参阅http://en.cppreference.com/w/c/io/fscanf的表格。
unsigned char x;
printf("Input x:");
scanf("%hhu", &x);
请注意,如果使用此格式说明符,则输入必须是数字。它不可能是一个角色。 65
将是有效输入,但A
不会。
出现您想要使用0xABCD
作为输入的问题,该值太大而无法容纳unsigned char
。您可以使用:
unsigned x;
printf("Input x:");
scanf("%x", &x);
要将该号码打印为0xABCD
,您可以使用:
printf("0x%X\n", x);
如果您不介意将号码打印为0xabcd
,则可以使用:
printf("%#x\n", x);
答案 1 :(得分:0)
在您的代码中
$randomSalt = base64_encode(mcrypt_create_iv(PBKDF2_SALT_BYTE_SIZE, MCRYPT_DEV_URANDOM));
$saltedPass = base64_encode($this->pbkdf2(PBKDF2_HASH_ALGORITHM,
$password,
$randomSalt,
PBKDF2_ITERATIONS,
PBKDF2_HASH_BYTE_SIZE,
true
));
$id = $this->NewGuid();
$sql = $this->dbh->prepare("INSERT INTO `{$this->dbtable}` (`id`, `username`, `password`, `password_salt`, `created`) VALUES(:id, :username, :password, :passwordSalt, NOW())");
/* Bind the default values */
$sql->bindValue(":id", $id);
$sql->bindValue(":username", $mail);
$sql->bindValue(":password", $saltedPass);
$sql->bindValue(":passwordSalt", $randomSalt);
//$sql->bindValue(":created", UNIX_TIMESTAMP(now()));
if($sql->execute())
{
$_SESSION['logSyscuruser'] = $id;
setcookie("logSyslogin", hash("sha256", $this->secureKey.$id.$this->secureKey), time()+3600*99*500, "/");
return true;
}
else
{
return false;
}
调用未定义的行为。 scanf("%s, &x);
的类型为x
,您无法使用char
来扫描该值。
您需要的是至少定义一个%s
数组,以便能够保留您的预期输入。
如果您想采用第二种方法,可以执行类似
的操作char
%x
格式说明符打印相同内容。<强> See it live 强>
答案 2 :(得分:0)
字符串是由'\0'
终止的字符数组。您正在将字符串读入单个字符,这是未定义的行为。
您的代码应该看起来像这样:
unsigned char x[64];
printf("Input x:");
scanf("%63s, x); /* use the size of buffer to prevent buffer overflows */
printf("%s", x);
答案 3 :(得分:0)
以任何方式&#34; 0xABCD&#34;不能被视为“char”#。 char可以存储8位值,因此从0到255(如果是无符号),给定数字0xABCD等于43981。
您可以将其作为字符串读取或将其读取为十六进制值(必须是无符号的)。对于这种情况的一个例子:
unsigned int x;
printf("Number: ");
scanf("%x", &x);
printf("%d / %X\n", x, x);
会给:
Number: 0xABCD
43981 / ABCD
如果被视为一个字符串,你将不得不以另一种方式对待它(sscanf ......)。
答案 4 :(得分:0)
没有char等价物,而是使用int。
int main(){
unsigned int x;
printf("Input x:");
scanf("%x", &x);
printf("\n%d (%#x)\n", x);
}