2017-04-18 99 views
-1

嘿,我不明白为什么我的代码不写时,我只把++ ndigit [c](而不是++ ndigit [c -'0'],然后用++ nchar [c]没关系。为什么我要写c - '0'而不是c?

如果您有任何政党成员,我会很感兴趣!

#include <stdio.h> 

int main() 
{ 
    int c, i, y, ns; 
    int ndigit[10]; 
    int nchar[26]; 

    ns = 0; 

    for(i = 0; i >= 0 && i<= 9; ++i) { 
    ndigit[i] = 0; 
    } 

    for(y = 'a'; y <= 'z'; ++y) { 
    nchar[y] = 0; 
    } 

    while((c = getchar()) != EOF) { 
    if(c == ' ' || c == '\t') { 
     ++ns; 
    } 

    if(c >= 'a' && c <= 'z') { 
     ++nchar[c]; 
    } 

    if(c >= '0' && c <= '9') { 
    ++ndigit[c]; 
    //++ndigit[c-'0']; 
    } 

    if(c == '\n') { 
     printf("chiffres: "); 
     for(i=0;i<10;++i) { 
     printf("%d:%d ", i, ndigit[i]); 
     } 

     printf("lettres: "); 
     for(y='a';y<='z';++y) { 
     printf("%d:%d ", y, nchar[y]); 
     } 
     printf("space: %d\n", ns); 
    } 
    } 
} 
+3

这将在任何好的C书中得到解释。我建议阅读一个而不要跳过章节。 – Olaf

回答

1

由于字符'4'(例如)通常不等于整数4。即'4' != 4

采用最通用字符编码方案ASCII,字符'4'拥有值52,字符'0'的值为48。这意味着如果你做了'4' - '0'你练习到52 - 48并得到结果4作为一个整数。

+0

Thx!我明白了。 –

1

实际上,当您将变量设置为c='0'时,这意味着c的值现在是ascii值'0',即= 48. 由于您将c的值设置为48,但数组大小是10,你的代码会得到一个运行时异常,因为你试图访问一个甚至不存在的索引。

请记住,当您使用'0'它意味着字符。因此,将该值设置为int变量会使该值等于该字符的ascii值。相反,您可以直接使用c=0

+1

编码可能不是ASCII。然而,标准确保字符“0” - “9”按顺序编码。请注意,此保证不适用于其他角色。 –

+0

但我认为ascii值固定为'0'到'9'和所有英文字母。 –

+0

同意你:) –

相关问题