gpt4 book ai didi

C编程-如何计算单词中字母的重复次数

转载 作者:行者123 更新时间:2023-11-30 20:09:51 24 4
gpt4 key购买 nike

我正在尝试编写一个程序,其中应该使用getchar()来计算每个字符的出现次数。例如,如果输入为 xxxyyyzzzz,则输出应为 334(x 重复 3 次,y 重复 3 次,z 重复 4 次)。如果输入为 xxyxx,则输出应为 212

这是我迄今为止尝试过的:

double nc ;
for (nc=0 ; getchar()!=EOF;++nc);
printf ("%.0f\n",nc);
return 0;

输入aaabbbccc,输出10。预期输出为 333

不幸的是,这显示了包括输入在内的字符总数,但不显示重复字符。

最佳答案

您所描述的内容通常是使用频率数组来处理的,该数组只是一个数组,其元素数量等于您想要计算其频率的项目数量(例如 26 表示所有小写字符)。该数组被初始化为全零。然后,将所需频率的集合中的每个成员映射到数组索引。 (对于小写字符,这特别容易,因为您可以映射 ch - 'a' 将每个字符 a 到 z 映射到数组索引 0 - 25 (例如,'a' - 'a' = 0'b' - 'a' = 1 等...

然后,只需循环遍历 stdin 上的所有字符,检查它们是否是您想要频率的集合中的一个(例如小写字符),并递增对应于的数组索引那个角色。例如,如果您使用 c = getchar(); 读取所有字符,那么您将按如下方式测试和递增:

#define NLOWER 26   /* if you need a constant, define one */
...
int c, /* var to hold each char */
charfreq[NLOWER] = {0}; /* frequency array */
...
if ('a' <= c && c <= 'z') /* is it a lowercase char ? */
charfreq[c - 'a']++; /* update frequency array */

读完字符后,每个字符的频率都会被捕获到频率数组中(例如 charfreq[0] 保存 'a' 的数量, charfreq[1] 保存 'b' 的数量,等等...)

总而言之,你可以做类似的事情:

#include <stdio.h>

#define NLOWER 26 /* if you need a constant, define one */

int main (void) {

int c, /* var to hold each char */
charfreq[NLOWER] = {0}, /* frequency array */
i; /* loop var i */

while ((c = getchar()) != EOF ) /* loop over each char */
if ('a' <= c && c <= 'z') /* is it a lowercase char ? */
charfreq[c - 'a']++; /* update frequency array */

/* output results */
printf ("\ncharacter frequency is:\n");

for (i = 0; i < NLOWER; i++)
if (charfreq[i])
printf (" %c : %2d\n", 'a' + i, charfreq[i]);

return 0;
}

示例使用/输出

$ echo "my dog has xxxyyyzzzz fleas" | ./bin/freqofcharstdin

character frequency is:
a : 2
d : 1
e : 1
f : 1
g : 1
h : 1
l : 1
m : 1
o : 1
s : 2
x : 3
y : 4
z : 4

仔细检查一下,如果有疑问请告诉我。这是一种基本频率跟踪方案,您将在许多不同的情况下反复使用。

<小时/>

按顺序输出所有频率

仅更改 printf,您就可以将频率输出为整数字符串,而不是格式良好的表格输出,例如

#include <stdio.h>

#define NLOWER 26 /* if you need a constant, define one */

int main (void) {

int c, /* var to hold each char */
charfreq[NLOWER] = {0}, /* frequency array */
i; /* loop var i */

while ((c = getchar()) != EOF ) /* loop over each char */
if ('a' <= c && c <= 'z') /* is it a lowercase char ? */
charfreq[c - 'a']++; /* update frequency array */

/* output results */
printf ("\ncharacter frequency is:\n");

for (i = 0; i < NLOWER; i++)
if (charfreq[i])
#ifdef SEQUENTIALOUT
printf ("%d", charfreq[i]);
putchar ('\n');
#else
printf (" %c : %2d\n", 'a' + i, charfreq[i]);
#endif

return 0;
}

使用定义的 SEQUENTIALOUT 进行编译

$ gcc -Wall -Wextra -pedantic -std=gnu11 -Ofast -DSEQUENTIALOUT \
-o bin/freqofcharstdin freqofcharstdin.c

示例使用/输出

$ echo "my dog has xxxyyyzzzz fleas" | ./bin/freqofcharstdin

character frequency is:
2111111112344

或者对于有问题的确切字符串和输出:

$ echo "xxxyyyzzzz" | ./bin/freqofcharstdin

character frequency is:
334
<小时/>

连续重复字符

如果我误解了您的问题,并且您不需要出现的频率,而是想要连续重复字符的计数,那么您可以执行如下简单的操作:

#include <stdio.h>

#define NLOWER 26 /* if you need a constant, define one */

int main (void) {

int c, /* var to hold each char */
prev = 0, /* var to hold previous char */
count = 1; /* sequential count */

while ((c = getchar()) != EOF) { /* loop over each char */
if (prev) { /* does prev contain a char ? */
if (prev == c) /* same as last ? */
count++; /* imcrement count */
else { /* chars differ */
printf ("%d", count); /* output count */
count = 1; /* reset count */
}
}
prev = c; /* save c as prev */
}
putchar ('\n');

return 0;
}

示例使用/输出

$ echo "xxyxx" | ./bin/sequentialduplicates
212

$ echo "xxxyyyzzzz" | ./bin/sequentialduplicates
334

关于C编程-如何计算单词中字母的重复次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48656303/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com