【问题标题】:Some questions for counting alphabet计算字母的一些问题
【发布时间】:2022-01-12 13:39:59
【问题描述】:

我对 C 非常陌生,并且对程序的这一部分有一些疑问。

我知道这是在计算字母,但是如果你比较变量 c 和 'a',它是如何工作的。

c 是 0,a 在 ASCII 码中是十进制的 97,所以无论如何都没有 if 语句是真的?

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

还有什么 A[c]++;当数组中只有 1 个元素时执行 int A[27] = {0}; ?

int c=0;
int A[27] = {0};

int main()
{
    
    do{

        if ( c >= 'a' && c <= 'z' ){
            c-='a';
            A[c]++;
        }
        else if ( c >= 'A' && c <= 'Z' ){
            c-='A';
            A[c]++;
        }
        else if (c == '\n'){
            continue;
        }
        else{
            A[26]++;
        }

    } while ((c = fgetc(data1)) != EOF);


    for (c = 0; c < sizeof A / sizeof A[0] - 1; c++)
    {
        printf("%c:%02d\t", c+'a', A[c]);
    }

}```

【问题讨论】:

  • int A[27] = {0}; 定义了一个数组(命名为A),其中包含int 类型的27 个元素(全部)。第一个元素 (A[0]) 被显式赋值为 0,其他 26 个元素被隐式初始化为 0(在 C 中没有部分初始化)。注意数组索引,对于 27 个元素,从 026
  • c = 0 与 c = '0' 不同。字符“0”的 ASCII 数值为 48。两者都小于 65 的“A”。
  • @stark 谢谢你的帮助,但是当 if 语句为真时我不明白 c >= 'a' && c

标签: arrays c ascii


【解决方案1】:

还有什么 A[c]++;当数组中只有 1 个元素时执行 int A[27] = {0};

在这个数组中

int A[27] = {0};

有 27 个元素。第一个元素 A[0] 显式初始化为零,所有其他元素也隐式初始化为零。所以所有元素都设置为0。

在 do-while 循环的第一次迭代中,变量 c 等于 0

int c=0;

因此,由于变量不包含字母(小写或大写),则控件将传递给此 else 语句

    else{
        A[26]++;
    }

即所有非字母字符都在数组的元素 A[26] 中进行计数。

如果变量 c 包含一个字母,例如 'a',则数组元素的索引的计算方式类似于 c - 'a',前提是所有字母彼此跟随,步长等于 1。

所以字母'a'(或'A')的出现在数组的元素A[0]中计算,字母'b'(或'B')的出现在数组中计算由于这些陈述,元素 A[1] 等等

        c-='a';
        A[c]++;

        c-='A';
        A[c]++;

然后在这个for循环中输出字母的出现

for (c = 0; c < sizeof A / sizeof A[0] - 1; c++)
{
    printf("%c:%02d\t", c+'a', A[c]);
}

请注意,一般情况下,所有字母不必以等于 1 的步长依次跟随。例如,对于字符的 EBCDIC 编码,这是不正确的。

【讨论】:

  • 非常感谢,我还有一个问题:您说不包含字母的所有内容都进入索引A[26]++;但是我可以在 [26] 中节省多少?例如,如果 fgetc 出现 2 或 3 个数字或特殊字符。
  • @skruf922 数组的元素类型是int。因此数组的每个元素都可以包含等于 INT_MAX 的最大值。
【解决方案2】:

c &gt;= 'a' &amp;&amp; c &lt;= 'z' 正在测试c 是否包含小写字母字符,该字符必须在“a”到“z”的范围内。如果 c 小于 'a' 则第一个测试失败,如果它大于 'z' 则第二个测试失败。

【讨论】:

  • 但是如果我的 c 值为零,那么 if 语句总是会失败?还有 c-='a';将从a中减去0减去asci值,那么c是否为-97?对不起,我真的不明白。
  • 在每个循环中读取 c 的新值:c = fgetc(data1)
【解决方案3】:

这段代码不是很好。您应该使用标准函数来检测字母。

int main(void)
{    
    int c;
    size_t A[26] = {0};
    while ((c = fgetc(stdin)) != EOF)
        if(isalpha(c = toupper((unsigned char)c))) A[c - 'A']++;

    for (c = 0; c < sizeof A / sizeof A[0]; c++)
        printf("%c:%zu%c", c +'A', A[c], !((c + 1) % 4) ? '\n' : '\t');
}

https://godbolt.org/z/jrTf751vW

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-17
    • 2021-07-30
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多