【问题标题】:Convert a char inside a String to ASCII将字符串中的字符转换为 ASCII
【发布时间】:2018-11-05 15:09:42
【问题描述】:

我正在为一个大学项目做一个迷你 C 编译器。

我的问题是:

如何获取字符串中char的ascii?

字符串始终采用以下格式: "'{char}'"

例如:

char* c1 = "'a'" #I want the ascii code of char: a

在这种情况下,我可以通过命令int(c1[1])获取ascii码。

但如果是这样的话:

char* c1 = "'\000'" #I want the ascii code of char: \000

如何获取本案例的ascii码?

是否有可能获得一个适用于所有情况的通用函数?

【问题讨论】:

  • (int)c2[1]; 会做到的。
  • "'a'" 是一个由 4 个字符组成的数组。你想要哪一个的 ASCII 码?
  • 您是否正在尝试编写一个基本可以解析 C-stryle 字符常量的小解析器?你可以这样做,但它不会涉及像atoi 这样基本的东西。
  • 我正在做一个 C 编译器。我想要存储在字符串中的 char 'a' 的 ASCII 码。有没有办法做到这一点?

标签: c string char ascii


【解决方案1】:

如果你想知道字符的代码,一个简单的方法是

char c1 = '\0';
int c1_code = c1;

char c2 = 'a';
int c2_code = c2;

printf("%d %d\n", c1_code, c2_code);

在 ASCII 系统上,这将打印 0 97

但这有点傻。直接写会更简单直接

int c1_code = '\0';
int c2_code = 'a';

这是因为 C 中有一个超级简单、超级重要的基本定义:

在 C 中,一个字符由一个小整数表示,该整数对应于机器字符集中该字符的值。

在某些语言中,您需要特殊函数来在字符和 cheir 字符集值之间来回转换。 (我相信 BASIC 使用 CHR$INT$ 之类的。)但在 C 中,您不需要任何特殊处理:字符基本上只是 它的值。

如果你想从 strings 中找到字符值(不是单个字符,正如我目前所展示的那样),它只涉及一点点。 C 中的字符串只是一个字符数组,所以你可以这样做:

char str3[] = "a"; int c3_value = str2[0]; /* 字符串中第一个字符的值 */

我可以像这样更简单地打印字符值:

printf("%d %d %d\n", 'a', 'b', 'c');

如果我从用户那里读到一行文字:

char line[100];
printf("type something:\n");
fgets(line, 100, stdin);

我可以像这样打印前几个字符的值:

printf("you typed:\n");
printf("%c = %d\n", line[0], line[0]);
printf("%c = %d\n", line[1], line[1]);
printf("%c = %d\n", line[2], line[2]);

如果您不熟悉 C 的字符处理,我鼓励您编写一个这样的小程序并玩弄它。例如,如果我运行该程序并输入“Hello, world!”进入它,它会打印出来

You typed:
H = 72
e = 101
l = 108

也许你知道这一切。也许你真的想做类似的事情

char *c1 = "'\\000'";

表示c1是一个包含六个字符的字符串

' \ 0 0 0 '

并且您希望将此字符串解释为 C 字符常量的语法,就像 C 编译器一样。也就是说,也许您基本上是在尝试编写解析字符常量的 C 编译器部分的微型版本。如果是这样,那将是一个完全不同的(而且涉及更多的)问题。

显然这你想要做的。见my other answer

【讨论】:

  • 我正在做一个 C 编译器,这是因为我想要最后一个选项。我必须将 char *c1 = " '\000'" 传递给 ASCII。 char 存储在一个字符串中,我必须将 char 传递给 ASCII 码。有什么办法吗?
【解决方案2】:

所以你正在尝试编写一个简单的lexical analyzer。 C中字符常量的语法是一个单引号,后面跟一个可以进去的东西,再跟一个单引号。可以进入的东西要么是单个字符,要么是转义序列。转义序列是一个\ 字符,后跟一个像n 这样的字符,或者是一到三个八进制数字。 (还有十六进制转义和多字符字符常量,但我们现在可能想忽略这些。)

因此,您需要编写能够处理所有这些可能性的代码。在伪代码中,它可能看起来像这样:

if first character is `'`, step over it
else error

if next character is not '\', it's the character code we want

else if next character is '\', we have an escape sequence; skip over it and...

    if next character is 'n', character code we want is '\n'
    else if next character is 'r', character code we want is '\r'
    else if next character is 't', character code we want is '\t'
    else if next character is a digit:
        read 1-3 digits
        convert from octal
        that's the character code we want

finally, if next character is `'`, step over it
else error

当人们真正编写词法分析器时,他们通常会使用一个程序来帮助他们,例如lexflex。但是,像这样手动编写自己的代码也是一个很好的学习练习。

【讨论】:

  • 在嵌套在 if-else 中的第三种 if-else 情况下,我们可以使用atoistrtol
  • strtol 也许。绝对不是atoi
  • @SteveSummit 谢谢你的朋友。还有一个问题,如果在第三个问题中,我如何转换为字符?我读了 3 位数字,但我如何将它存储在一个字符中?
  • 您可以使用strtol,也可以手动操作:有一个以0开头的变量,然后每次看到另一个数字,取之前的数字,乘以8,并添加您刚刚看到的数字。您需要减去'0',才能将字符值转换为数字值。
  • 当我使用 strtol: strtol("'\127'",&p,10) 结果总是0。
【解决方案3】:

如果你只想要字符串中任何字符的 ASCII 码,你可以像这样直接索引到数组中:

char *foo = "asdf";
char bar = foo[3];
// bar == 'f'

【讨论】:

  • 好吧,它是,它不是。 foo 绝对是一个指针,但指针恰好指向程序员可以使用的内存。但是,编译器会理解您需要一个数组,因此如果sizeof 与声明在同一范围内使用,sizeof 将给出分配的内存总大小。
  • 您在语义上是正确的,但就这个问题而言,我认为区别不相关 - 你呢?
  • 我想要最后一个选项。我正在做一个 C 编译器,并且 char 'a' 存储在一个字符串中。我想得到字符'a'的ASCII码。有什么办法吗?
  • 我不确定你所说的语法错误是什么意思,但我明白你的意思。我会编辑它。我不确定这种态度是否必要
  • @JoãoCastilho 那么你的字符串实际上是"'\\123'",而不是"'\123'"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 2011-01-13
  • 2016-03-02
相关资源
最近更新 更多