如何在C中扫描和打印未签名的字符?

时间:2015-10-14 16:13:19

标签: c unsigned

我正在尝试向用户询问输入,将该输入设置为unsigned char,然后将其打印出来。例如,输入将询问我“输入x:”并输入0xABCD作为输入。我还需要打印出“0xABCD”。

这是我到目前为止所拥有的:

unsigned char x;
printf("Input x:");
scanf("%s, &x);

printf("%u", x);

它给我0而不是0xABCD。

我做错了什么?

5 个答案:

答案 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); 
}