【问题标题】:Assign a Number to a char variable in C?将数字分配给C中的char变量?
【发布时间】:2018-07-11 17:04:23
【问题描述】:

我打算将数字数据类型分配给 char 变量。 代码是这样的:

#include <stdlib.h>
#include <stdio.h>

typedef unsigned short ushort;
typedef unsigned u;

ushort getRandomNumber(){
    return (ushort)(rand() % 9);
}

ushort getASCII(char Char) {
    return (ushort)Char;
}

char getRandomChar() {
    ushort chance = (rand() % 2) + 1;
    const ushort aASCII = 97 , zASCII = 122 , AASCII = 65 , ZASCII = 89;
    if(chance == 1)
        return (char)(aASCII + (rand() % (zASCII - aASCII)));
    else
        return (char)(AASCII + (rand() % (ZASCII - AASCII)));
}

int main(void) {
    srand(time(NULL));
    ushort size;
    puts("Enter password size : " );
    fflush(stdout);
    scanf("%i" , &size);
    if(size >= 4) {
    char Password[size + 1];
        for(ushort i = 1 ; i <= size ; ++i){
            ushort chance = (rand() % 2) + 1;
                if(chance == 1)
                    Password[i] = getRandomChar();
                else
                    Password[i] = getRandomNumber();

        }
    printf("%s" , Password);
    return EXIT_SUCCESS;
    }
    else {
        puts("Error. Try again");
    }
}

它不会返回任何错误,但会打印与 ASCII 码匹配的字符。所以这段代码不会是正确的。

原始代码是一个随机密码生成器,我知道它不是很好且安全。随机数在输出中显示为 ASCII 字符。

我在 Google 上搜索但没有有用的结果。只有this,但它是相反的过程。 它的命令/算法是什么?

感谢您的帮助。

编辑:这里的问题是我将 int 分配给包含我不想显示为数字的字符的 char 数组。

【问题讨论】:

  • printf("%d", b) 会做...
  • 您没有为 char 数组分配任何内容。您的代码中没有数组。
  • 目前还不清楚你想用int a 做什么。 原始数组还有一个分配了空值的节点。然后请edit你的问题包含实际代码,这样我们就可以停止在黑暗中拍摄。
  • 是的,这很重要,您在 25 分钟前提出了这个问题,并且针对多个问题提出了多种解决方案,但都没有回答您的实际问题,这仍然是未知的。
  • 你希望这个程序输出“e123d4”吗?

标签: c char int


【解决方案1】:

由于您实际所做的是用字母或单个数字填充字符串,因此您实际上并不想存储数字本身,而是存储数字的 ASCII 码。

你可以这样做:

ushort getRandomNumber(){
    return '0' + (ushort)(rand() % 10);
}

注意 ASCII 码使用字符常量而不是“幻数”。获取角色时也可以进行类似的更改:

char getRandomChar() {
    ushort chance = (rand() % 2) + 1;
    if(chance == 1)
        return 'a' + (rand() % ('z'- 'a' + 1));
    else
        return 'a' + (rand() % ('Z' - 'A' + 1));
}

C 标准保证 0 - 9 的数字在使用任何字符编码时都是连续的。但是,对于字母,该保证存在。

您可以通过创建一个包含您想要使用的所有字符的数组并索引到该数组以获得给定的随机字符来进一步简化逻辑:

char characters[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

    for(ushort i = 1 ; i <= size ; ++i){
        Password[i] = characters[rand() % sizeof(characters)];
    }
    Password[i] = 0;

【讨论】:

  • 你的最后一个代码是安全的吗?最后一行是我需要理解的。
  • @Programmer 并非如此,因为这两个版本都没有使用加密安全的随机数生成器,但它更清晰简洁。
  • 加密安全随机数生成器?你对这个表达有什么参考吗?
  • @Programmer 这是一个随机数生成器,其中的值更难猜测。 rand 函数不合格,但 OpenSSL 的 RAND_bytes 可以。
【解决方案2】:

我认为你想要从 int 到 char 的类型转换,但是由于我们一次只能将单个数字转换为 char,所以我们必须提取所有数字并将其存储在一个字符串中,然后将字符串反转以获得答案。

希望这段代码能给你一些想法

#include <stdio.h>
#include <stdlib.h>
#define max 10000
int main(void){
    int a = 12233;
    char b[max];             // Create a char array of max size
    int i=0,j;
    while(a)
    {
        int rem = a%10;            // since we can only convert single int digit to char use loop to extract digits
        b[i] = rem + '0';          // and convert into char
        i++;
        a = a/10;
    }
    b[i] = '\0';                  // don't forget to insert '\0' to make it string
    for(i=0,j=strlen(b)-1;i<=j;i++,j--)        // now we have char array like 21, so we have to reverse it
    {
        char temp = b[i];
        b[i] = b[j];
        b[j] = temp;
    }

    puts(b);                       // print string
    return 0;
}

【讨论】:

    【解决方案3】:

    使用 printf() 会有所帮助, puts() 用于将字符串打印到控制台

    #include <stdio.h>
    #include <stdlib.h>
    int main(void){
        int a = 12;
        char b = a;
        printf("%d",b);
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      相关资源
      最近更新 更多