如何在C语言中计算字符串中字符的频率
我发现了计算字符串中字符频率的代码,但是,它们都使用同一行代码,没有解释它的含义。有人能告诉我吗 以下是一个例子:如何在C语言中计算字符串中字符的频率,c,ascii,C,Ascii,我发现了计算字符串中字符频率的代码,但是,它们都使用同一行代码,没有解释它的含义。有人能告诉我吗 以下是一个例子: int c = 0, count[26] = {0}, x; while (string[c] != '\0') { /** Considering characters from 'a' to 'z' only and ignoring others. */ if (string[c] >= 'a' && string[c] <= 'z') {
int c = 0, count[26] = {0}, x;
while (string[c] != '\0') {
/** Considering characters from 'a' to 'z' only and ignoring others. */
if (string[c] >= 'a' && string[c] <= 'z') {
x = string[c] - 'a';
count[x]++;
}
intc=0,count[26]={0},x;
while(字符串[c]!='\0'){
/**只考虑从“a”到“z”的字符,而忽略其他字符*/
如果ASCII数据库中的(字符串[c]>='a'&&string[c],'a'到'z'具有从0x61到0x7A的连续数字代码。cf。
因此,如果减去“a”的值,则得到0到25之间的数字。该数字是count[]表中的索引。在ASCII数据库中,“a”到“z”具有从0x61到0x7A的连续数字代码。cf。
因此,如果减去“a”的值,则得到从0到25的数字。该数字是count[]表中的索引。TL;DR利用ASCII表
代码仅接受从a
到z
的字符:
if (string[c] >= 'a' && string[c] <= 'z')
将string[c]
转换为int
;事实,该事实可用于利用
根据ASCII表格,字母“a”到“z”分别由97
到112
的int
值表示。因此,由于C中的数组以0
开头,我们需要将97
元素从字符串[C]
返回的值向左移动,即:
x = string[c] - 97;
可以用
x = string[c] - 'a';
使用此技巧,如果string[c]
是“a”,则:
x = 'a' - 'a';
转换为x=97-97
,然后x=0
;因此
count[x]++;
是count[0]++;
它将数组计数的位置0增加1,该位置被“保留”到字母“a”。此逻辑同样适用于从“a”到“z”的所有其他字母
然而,请记住并引用:
C实现中使用的字符代码不一定具有
所有字母都是连续的。ASCII确实是,而且非常常见,但不是
标准要求的
因此,如果您的编码是ASCII,此解决方案将起作用。TL;DR利用ASCII表
代码仅接受从a
到z
的字符:
if (string[c] >= 'a' && string[c] <= 'z')
将string[c]
转换为int
;事实,该事实可用于利用
根据ASCII表格,字母“a”到“z”分别由97
到112
的int
值表示。因此,由于C中的数组以0
开头,我们需要将97
元素从字符串[C]
返回的值向左移动,即:
x = string[c] - 97;
可以用
x = string[c] - 'a';
使用此技巧,如果string[c]
是“a”,则:
x = 'a' - 'a';
转换为x=97-97
,然后x=0
;因此
count[x]++;
是count[0]++;
它将数组计数的位置0增加1,该位置被“保留”到字母“a”。此逻辑同样适用于从“a”到“z”的所有其他字母
然而,请记住并引用:
C实现中使用的字符代码不一定具有
所有字母都是连续的。ASCII确实是,而且非常常见,但不是
标准要求的
因此,如果您的编码是ASCII,此解决方案将起作用。count[26]
是频率表。count[0]
是a
的出现次数count[1]
是b
的出现次数,等等
将计数
数组初始化为所有零值
count[26] = {0}
而不是字符串的结尾。请记住,C字符串总是以空字符结尾(\0
)
计算字符串[c]处的字符是否介于a和z之间
if (string[c] >= 'a' && string[c] <= 'z') {
使用上面计算的x
值,将其作为count
表的索引
将count[x]
中的任何值递增1
count[x]++;
此代码示例缺少的是c
递增1的位置,这样string[c]
将引用字符串中的下一个字符。count[26]
是频率表。count[0]
是a
的出现次数count[1]
是出现b
等的次数
将计数
数组初始化为所有零值
count[26] = {0}
而不是字符串的结尾。请记住,C字符串总是以空字符结尾(\0
)
计算字符串[c]处的字符是否介于a和z之间
if (string[c] >= 'a' && string[c] <= 'z') {
使用上面计算的x
值,将其作为count
表的索引
将count[x]
中的任何值递增1
count[x]++;
此代码示例缺少的是c
递增1的位置,这样string[c]
将引用字符串中的下一个字符。count[26]
是一个由26个整数组成的数组,每个整数表示从'a'
到'z'
的一个小写字母在字符串中的计数
计数[0]
是'a'
的计数器,计数[1]
是'b'
等的计数器
x=string[c]-'a'
计算并分配给x
在string[c]
中找到的字符的索引0-25。
简化:记住'a'
是97位十进制的整ascii值。'a'
的减法是将所有索引从'a'
减少到'z'
到计数[]
数组所需的0到25之间的值。计数[26]
是一个由26个整数组成的数组,每个整数表示从'a'
到'z'
的小写字母的计数<