Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C语言中计算字符串中字符的频率_C_Ascii - Fatal编程技术网

如何在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'
的小写字母的计数<