繁体   English   中英

使用tolower并存储在数组中

[英]The use of tolower and storing in an array

我试图跟踪这个问题,无法弄清楚星形是如何通过while循环并存储在数组中的。 *是否由于较低而存储为8? 如果有人可以通过第一个for-到第二个for loop请我永远感激。

#include <stdio.h>
#include <ctype.h>

int main()
{
    int index, freq[26], c, stars, maxfreq;

    for(index=0; index<26; index++)
        freq[index] = 0;

    while ( (c = getchar()) != '7')
    {
        if (isalpha(c))
            freq[tolower(c)-'a']++;

        printf("%d", &freq[7]);

    }

    maxfreq = freq [25];
    for (index = 24; index >= 0; index--)
    {
        if (freq[index] > maxfreq)
            maxfreq = freq[index];
    }   

    printf ("a b c d e f\n");

    for (index = 0; index < 5; index++)
    {
        for (stars = 0; stars < (maxfreq - freq[index]); stars ++)
            printf(" ");

        for (stars = 0; stars < (freq[index]); stars++)
            printf("*");

        printf("%c  \n", ('A' + index) );
        printf(" \n");
    }
    return 0;
}

似乎该代码是各种直方图,可打印出给定字符在到达字符“ 7”之前已被输入控制台多少次。

如下代码:

for(index=0; index<26; index++)
    freq[index] = 0;

只是将数组的所有值都设置为0。这是因为在C语言中,在块范围内(即在函数内部)声明且不是静态的变量没有特定的默认值因此,只需包含声明该变量之前该内存中的垃圾即可。 显然,这会影响每次运行或在其他地方运行时显示的结果,我不确定这不是您想要的。

while ( (c = getchar()) != '7')
{
    if (isalpha(c))
        freq[tolower(c)-'a']++;

    printf("%d", &freq[7]);

}

下一部分使用while循环继续使用getchar()接受输入(在这种情况下,它将从STDIN获取输入的下一个字符),直到到达字符“ 7”为止。 这是由于以下事实:分配值(例如“ c = getchar()”)允许使用该值,以便可以使用“!='7'”进行比较。 这使我们可以继续循环直到从STDIN接受的字符等于'7',此后while循环将结束。

在循环本身内部,它将检查使用“ isalpha()”输入的值,如果该字符是字母,则返回true。 通过使用“ tolower()”并返回该值减去字符值“ a”,我们基本上可以找到字母中哪个字符是数字。 例如,如果我们使用字母“ F”。 大写字母“ F”作为值70存储在后台。 tolower()检查它是否是大写字符,如果是,则返回它的小写版本(在本例中为'f'== 102)。 然后将此值减去“ a”(存储为97),该值返回值6(从0开始计数时,它是字母中“ F”的位置)。 然后将其用于定位数组的该元素并使其递增,这告诉我们已经输入了另一个“ F”或“ f”。

maxfreq = freq [25];
for (index = 24; index >= 0; index--)
{
    if (freq[index] > maxfreq)
        maxfreq = freq[index];
}

下一部分将变量“ maxfreq”设置为最后一个值(找到“ Z”的次数),然后向下迭代,将maxfreq的值更改为找到的最大值(即,给定值中最大的数字)在数组中找到的字符)。 以后将其用于格式化输出,以确保字母正确对齐并且星号和空格的数量正确。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM