【问题标题】:C programming - integers and charactersC 编程 - 整数和字符
【发布时间】:2013-07-08 18:36:59
【问题描述】:

这是我从一本关于 C 编程的电子书中摘录的。

我了解字符“0”和“9”的 ASCII 表示是整数,因此我了解与整数数组的兼容性。我只是不确定显示的输出是如何计算的?输入的是代码本身。

这句话是什么意思?

++ndigit[c-'0'];

那么,程序本质上是否检查输入是否是 ASCII 代码表的前 10 部分之一? ASCII CODE

【问题讨论】:

  • c-'0''0''9' 的ASCII 字符之一转换为等效的整数值。
  • 电子书中还有一个声明,声称使用单引号 ' ' 会将引号内的任何内容转换为其等效的 int。也就是说,'A' = 65。这是真的吗?
  • 'A' == 65 在许多但不是所有系统上都是正确的(反例:使用 EBCDIC 的 IBM 大型机)。 'A' 始终是 int(在 C 中;在 C++ 中为 char),并且表示大写字母 A 的数字代码。

标签: c integer ascii


【解决方案1】:

不,它没有。

c - '0'c 中减去字符0 的(不一定是ASCII)字符代码。如果c 是一个数字,这将产生一个介于 0 和 9 之间的数字。然后,生成的整数用于使用 [] 运算符对零初始化的 ndigit 数组进行索引,然后使用前缀递增运算符 (++) 来递增该特定索引处的元素。

顺便说一句,代码在多个地方都是错误的。我建议您换一本书,因为这本书似乎已经过时和/或鼓励使用几种类型的不良编程实践。

首先,main() 没有返回类型,这是一个错误。它需要声明为int main()int main(void)int main(int, char **)。旧的编译器有一个坏习惯,即假设一个隐式的 int 返回类型,如果它被省略,但现在这种行为已被弃用。

其次,最好初始化ndigit数组,像这样:

int ndigit[10] = { 0 };

for 循环是多余的,因为我们可以进行初始化;它也比初始化语法可读性差,而且也很危险:作者没有使用sizeof(ndigits) / sizeof(ndigits[0])计算数组的计数,但是他硬编码了它的长度,这可能会在数组长度改变时导致缓冲区溢出(减少)并且忘记了 for 循环中的硬编码长度值。

【讨论】:

  • @sherrellbc 不。 '0' 是 ASCII 48。获取更好的 ASCII 字符代码表。
  • @sherrellbc 他们是,但这与问题有什么关系?
  • @sherrellbc sizeof() 不是运行时构造,除非应用于 VLA。它评估为编译时常量。但是从C99开始,你也可以写size_t length = some_length; int arr[length];,不过那是另外一回事了。
  • @sherrellbc 我不明白你所指的评论。 C++ 是如何出现的?你所说的“一个类型用于表示'A'而不是48”是什么意思? - 此外,您仍然假设单词中的所有系统都使用 ASCII,这是不正确的。
  • @sherrellbc 是的,char 是 C 和 C++ 中的数据类型。字符文字在 C 中属于 int 类型,在 C++ 中属于 char 类型。不要总是试图在 C 和 C++ 之间进行比较,尤其是在你刚刚学习 C 的时候,因为它们是非常不同的语言,并且总是试图通过“但是这个和这个在 C++ 中像这样工作”会给你错误的印象并导致错误的假设。另外,是的,K&R 很好,但现在只有你再买一本更新的书才更好。
【解决方案2】:

程序计算 0 到 9 之间的数字作为输入被引入的次数、输入中包含多少空格和其他字符。

++ndigit[c-'0'];

'0' - 整数是 0 的 ASCII 码。
c - 是读取的字符(其 ASCII 码)
c - '0' = ASCII 码 c 表示的实际数字(0 到 9 之间)。

例如 '3'(ASCII) 将是 3(digit=integer) + '0'(ASCII)

这就是您在数组中为您的数字获取索引并增加该数字出现的次数的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    相关资源
    最近更新 更多