繁体   English   中英

如何从c中的数组打印char类型?

[英]How do I print char types from an array in c?

int remainder;
char Hex[8];
int quotient, power;
remainder = (original_value*-1)-1;
for (int k = len; k > 0 ; k--)
{
    if (sign == 1)
    {
        power = pow(16, k-1);
        quotient = 15 - (remainder/power);
        remainder = remainder%power;
        if (quotient < 10)
            Hex[len - k] = (int)quotient;
        else if (quotient == 10)
            Hex[len - k] = 'A';
        else if (quotient == 11)
            Hex[len - k] = 'B';
        else if (quotient == 12)
            Hex[len - k] = 'C';
        else if (quotient == 13)
            Hex[len - k] = 'D';
        else if (quotient == 14)
            Hex[len - k] = 'E';
        else if (quotient == 15)
            Hex[len - k] = 'F';
    }
}


for(int k = 0; k < len; k++)
    printf("%s", Hex[k]);

我没有包括其余的代码,因为这应该可以解释我要实现的目标。 我的目标是打印出用户输入的任何数字的Base 16表示形式,但是我需要将此数据保存到数组中以备后用,如何在char数组中打印数据(最后两行) ,以使字符像在我的for循环中一样显示?

尝试这个希望这将工作并享受

  printf("%s", Hex[k]); ==> printf("%c", Hex[k]);

而pow提升2的幂实际上是次优的。 您应该使用班次(<<)

一些快速而肮脏的代码可以做到这一点。

unsigned int somevalue = 3543577; 
char hexout[9];
const char *hexchar = "0123456789ABCDEF";
for(int i=7; i>=0; i--, somevalue >>= 4) 
    hexout[i] = hexchar[somevalue & 0xF];
hexout[8] = 0;

printf("%s\n",hexout);

注意有关sizeof int等的假设。

您正在使它变得比原来困难得多。

  • 处理整数类型时,请避免使用浮点数(例如pow() 由于浮点数的精度有限,它引入了整个工件。 仅对整数类型使用操作。
  • %s格式需要一个零终止的字符串( char数组)。 Hex[k]是单个字符-这是类型不匹配。 如果格式说明符和相应参数的类型不匹配,则printf()给出未定义的行为。

如果您确实必须循环执行此操作,则此方法很简单。 注意,我假设original_value为正,并且您不需要保留其原始值。

char Hex[9];
const char hex_digits[] = "0123456789ABCDEF";
for (int i = 0; i < 8; ++i)
{
    Hex[7-i] = hex_digits[original_value % 16];
    original_value /= 16;   
}
Hex[8] = '\0';

original_value为正的假设至关重要,因为取模运算符( original_value % 16 )将产生一个介于015之间的值(包括015 ,并且整数除法( original_value /= 16 )会四舍五入为零。

这将添加前导零,因此值300的输出字符串将为“ 0000012C”。 我将把它留作练习,以弄清楚如何获得前导空格而不是前导零。

您也可以使用等效的按位运算来完成上述操作,但我将其保留为练习。 我认为使用基本的数学运算可以更轻松地进行此练习(大多数人,如果被要求用十六进制在纸上写一些值,则可以进行除法运算和余数运算,而不是一点点摆弄)。

但是,上述操作(即使尝试循环执行)也是不必要的。 您真正需要做的只是;

 char Hex[9];
 sprintf(Hex, "%08X", (unsigned)original_value);

如果要空格而不是前导零,请从格式字符串中删除0

请注意,我已将Hex的尺寸增加了1 这允许sprintf()附加尾随零(并防止未定义的行为,因为sprintf()会提供所提供的数组足够大以包含该尾随字符)。 这也将使您可以使用

 printf("%s", Hex);

一直打印字符,直到找到结尾的零字节。

如果您不希望数组中的尾随零字符,显然您需要调整上面的逻辑。 但是,您还需要避免尝试将数组打印为字符串(例如,使用%s格式)。

请记住,您的问题ASSUMES int是32位类型(例如,对于64位类型,将需要更大的数组)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM