[英]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
)将产生一个介于0
和15
之间的值(包括0
和15
,并且整数除法( 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.