【问题标题】:C How to convert ASCII numbers in an array to textC如何将数组中的ASCII数字转换为文本
【发布时间】:2021-01-26 10:11:26
【问题描述】:

如何将这个带有 ASCII 数字的数组转换为文本,所以每个数字都是一个字母。所以“72”得到 H,101 得到 E,依此类推。

int a[] = {72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100};

【问题讨论】:

  • 应该注意到目前为止的答案假设 C 实现使用 ASCII。这很常见,但不是 C 标准所要求的。如果要在不使用 ASCII 的 C 实现中打印 ASCII 字符代码的字符,当然必须将它们转换为 native 方案。

标签: c ascii


【解决方案1】:

可以遍历数组,使用%c格式化参数打印int值的ascii字符

for (int i = 0 ; i < 11; i ++){
   printf("%c", a[i]);
}

【讨论】:

  • 这是一个坏主意,因为它假设小端存储。在大端计算机上,您打印的只是一堆零符号(不可打印)。
  • @Lundin :不,这里不涉及字节序。 arrary-contents 被评估为 values,这些值用作 printf() 的参数。
  • 考虑printf("%c", (int){0x11223344});。这会在我的小端机器上打印 'D',因为 0x44 是 'D' 的 ASCII 码。在大端机器上,它会打印0x11 对应的任何乱码。同样,printf("%X", *(unsigned int*)(char[]){0x11,0x22,0x33,0x44}); 打印出44332211
  • 是的,字符值总是被提升为 int,即使在 for (cp="hello"; *cp; cp++) { printf("%d\n", *cp); } 的情况下(也适用于 "%c\n"
  • @Lundin:“这是个坏主意,因为它假设小端存储。在大端计算机上,您打印的只是一堆符号零(不可打印)”是垃圾。根据 C 2018 6.5.2.2 7,默认参数提升是在格式字符串之后的参数上执行的,因此 a[i](char) a[i] 都以完全相同的方式传递,作为具有 @987654334 值的 int @ (除非数组元素之一超出char 的范围,问题中没有)。
【解决方案2】:
  1. C 字符类型 C 使用 char 类型来存储字符和字母。但是,char 类型是整数类型,因为 C 底层存储的是整数而不是字符。
int main(int argc, char *argv[], char **env) {
    int a[] = {72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100};
    for (int i = 0; i < sizeof a / sizeof(int); ++i) {
        printf("%c", (char) a[i]);

    }
}

【讨论】:

  • 你不需要演员表......这不仅是多余的:它是一个悲观:在第一次显式转换后,编译器将再次转换为int 用于将值传递给 可变参数函数printf("%c", a[i]); 完全没问题:"%c" 需要 int 类型的值。
  • 另外,如果char 被签名并且数组包含char 范围之外的字符代码(这也将是超出 ASCII)。
【解决方案3】:

C 中的一切都是数字。编译器无法分辨整数常量72'H' 之间的区别,它们会产生一个数字,甚至它们都具有int 类型。字符和数字格式仅适用于您向人类用户提供原始数据时。

所以没有将72 转换为'H',它已经是正确的格式,原始数字72。我们只需要告诉计算机我们希望将这个原始数字打印为一个字符。最简单的方法是printf("%c", ...,但它需要char 类型的参数。所以我们必须将a[0]int 类型转换为char,这可以通过强制转换来完成。 printf("%c", (char)a[0]);.

如果数组是char a[] = {72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100};,那么就不需要强制转换了。

【讨论】:

  • 格式不正确,这就是演员表的用途。 720x48000000'H'0x48
  • @OrangeDog: "720x48000000" 不,不是。 0x480000001207959552‬,而不是 72
  • @alk 错字,谢谢。我认为所有这些破坏性的讨论让我的大脑改变了字节顺序......
  • "%c" printf() 转换说明符需要 int 类型的值
  • @pmg 我们已经在另一个答案中进行了讨论。是的,确实%c 必须处理int 格式的输入,因为默认参数提升。虽然形式上是“如果任何参数不是相应转换规范的正确类型,则行为未定义。”因此,始终始终如一地转换为预期的类型。下一次那里有另一个转换说明符,传递的类型可能很重要。
【解决方案4】:

您可以使用结构数组,因为数组可能包含不同的数据类型。 试试这个:

#include <stdio.h>
struct data
{ 
    int j; 
    char c;
};
int main() 
{
    int a[] = {72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100};
    int size = sizeof(a)/sizeof(a[0]);
    struct data value[size];
    for(int i=0;i<size;i++)
    {
        if(a[i]>=48 && a[i]<=57)
        {
            char ch= a[i];
            value[i].j =ch; 
        }
        else
        {
            char ch= a[i];
            value[i].c =ch;  
        }
    }
    for(int i=0;i<size;i++){
         if(a[i]>=48 && a[i]<=57)
            printf("%d",value[i].j); 
        printf("%c",value[i].c); 
         }
   return 0;
}

输出将是:Hello World (希望对您有所帮助。)

【讨论】:

    猜你喜欢
    • 2019-05-23
    • 1970-01-01
    • 2011-10-03
    • 2020-05-22
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多