【问题标题】:Storage of ASCII values of a string in an integral array in C [closed]在C中将字符串的ASCII值存储在整数数组中[关闭]
【发布时间】:2018-03-20 15:40:56
【问题描述】:

如何将字符串ASCII值存储在整数数组中而不是打印它们在C? 例如:我输入 "ABab" 并且我有一个 a[4] 数组,那么我如何存储 a[0]=67, a[1]=66, a[2]=97 , a[3]=98?

【问题讨论】:

  • 字符串已经存储为 ASCII 值数组。如果您有问题,请发布您的minimal reproducible example
  • 你能解释一下“而不是打印”部分吗?如果您不想打印它们,就不要打印它们。
  • 在这样的问题中,你应该自己尝试一下,然后询问你写的代码,如果它不起作用。
  • 在 C 中没有花哨的方法。只需使用一个简单的 for 循环并将一个数组中的值一一分配给另一个数组。
  • 请注意,’A’ 的代码通常是 65,而不是 67。

标签: c arrays string char ascii


【解决方案1】:

您可以使用循环将字符串的元素复制到 int 类型的数组中。

例如

#include <stdio.h?

int main( void )
{
    char *s = "ABab";
    int a[4];
    const size_t N = sizeof(a) / sizeof(*a);

    size_t i = 0;

    for (; i < N && s[i] != '\0'; i++) a[i] = s[i];
    while (i != N) a[i] = 0;

    for (i = 0; i < N; i++) printf("%d ", a[i]);
    putchar('\n');

    return 0;
}

程序输出为

65 66 97 98

如果你需要将字符数组输出为整数而不是它们的符号表示,那么你可以写

#include <stdio.h?

int main( void )
{
    char *s = "ABab";

    for ( size_t i = 0; s[i] != '\0'; i++) printf("%d ", s[i]);
    putchar('\n');

    return 0;
}

考虑到char 类型可以表现为signed charunsigned char 类型。如果您想将字符存储或输出为无符号值,您应该在第一个程序中编写

for (; i < N && s[i] != '\0'; i++) a[i] = ( unsigned char )s[i];

在第二个程序中

for ( size_t i = 0; s[i] != '\0'; i++) printf("%d ", ( unsigned char )s[i]);

也就是说,您需要将char 显式转换为unsigned char

【讨论】:

    【解决方案2】:

    我猜你知道计算机是在“binary digits (bits)”上工作的,所以你有没有问过自己计算机如何存储一个字符

    答案是:这就是 字符编码(如 ASCII)的意义所在:它们为每个字符分配一个唯一编号,而该编号就是存储的内容!

    由于 C 几乎可以在任何机器/系统/操作系统上工作,它没有指定字符使用哪种编码,它只是指定了这种编码必须满足的一些属性。 ASCII 只包含 128 种不同的代码(可以用 7 位表示的数量),所以现在使用比 ASCII 更大的编码,但是很有可能非常接近 1,您的系统使用编码包括 ASCII(通常是 UTF-8)。

    因此,正如已经评论过的,当您读取char 数组中的字符时,您已经最终得到了存储在那里的 ASCII 值。 char 是 C 中最小的整数类型,对应一个字节——而 byte 正是存储字符表示所需的位数。这几乎总是 8 位,但 C 标准允许更大的值。

    如果您想打印一个数字,您必须将其转换为小数位并将这些转换为字符09 的 (ASCII) 代码。当然,C 已经为您提供了一个函数:printf() 和一个合适的格式字符串。要打印字节/char 的十进制值,您可以简单地执行以下操作:

    char c = 'A';
    printf("%hhu", (unsigned char)c);
    

    u 是无符号整数的转换说明符,hh 将参数的长度修改为 char,并且您将 char 转换为 unsigned char,因为 C 允许 char要么签名未签名。

    【讨论】:

      【解决方案3】:

      正如您提到的,它已经存储了:字符串是char 的数组,char 是整数。

      【讨论】:

        猜你喜欢
        • 2019-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-29
        • 1970-01-01
        • 1970-01-01
        • 2012-09-14
        相关资源
        最近更新 更多