簡體   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