【问题标题】:doubts using array and switch in?怀疑使用数组和切换?
【发布时间】:2013-08-10 10:58:14
【问题描述】:

语句ndigit[c-'0']的作用是什么? 我正在使用 ansi c。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
    int c, i, ndigit[10];
    for(i = 0; i < 10; i++)
        ndigit[i]=0;
    while((c = getchar())!= EOF)
    {
        switch(c)
        {
            case '0' :case '1' :case '2' :case '3' :case '4' :case '5' :case '6' :case '7' :case '8' :case '9' : ndigit[c-'0']++;
            break;
        }
    }
    printf("digits=");
    for(i=0;i<10;i++) printf("%d",ndigit[i]);
    return 0;
}

【问题讨论】:

  • 嗨 :-) 欢迎使用 StackOverflow (SO)。请(下次)添加您正在使用的语言。因为数组可以有多种语言。

标签: c arrays switch-statement


【解决方案1】:

c 是一个 ascii 字符值(尽管以整数类型存储)。例如ascii 中的字符 '0' 是 48,所以如果 getchar 返回字符 '0' 那么 c 将具有整数值 48。

c - '0' 对两个字符值进行减法(好吧,它在减法之前将 '0' 转换为整数 48),从而提供一个准备好索引到数组中的整数。

所以 char '1' 变成整数 1,char '2' 变成整数 2,以此类推

对于一组已知的值,这只是一种将 ascii 字符值转换为整数值的快速方法。对于超出预期范围 '0'-'9' 的字符会产生奇怪的结果 - 例如如果您使用字符“+”执行此操作,您将得到 -5,这不是一个好的数组索引。不过没关系,因为 switch 语句会检查它是否在 '0' - '7' 范围内。

【讨论】:

  • 请不要介意我错了..但是 c 被声明为 int ???多一点解释会有所帮助.thanx
  • 好的,你是对的 - 我会更新我的答案。但这仍然是正确的 - 只是 c 是一个 int 保存字符的整数值,它来自 getchar()
  • 很好解释...thanx
猜你喜欢
  • 2017-10-01
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多