gpt4 book ai didi

c - 如何打印字符串中字符的频率?

转载 作者:太空宇宙 更新时间:2023-11-04 04:58:43 24 4
gpt4 key购买 nike

假设输入是

tree

以下代码显示了 t1r1e2e2 的输出。如何避免打印两次 e2

int main() 
{
char a[20];
int count, j, i, k; //abcd
gets(a);
int p = strlen(a);

for (j = 0; j < p; j++) {
count = 0;
for (k = 0; k < p; k++) {
if (a[j] == a[k])
break;
}
for (i = 0; i < p; i++) {
if (a[j] == a[i]) {
count++;
}
}
printf("%c%d", a[j], count);
}
}

最佳答案

你的代码有问题

  • 不要使用 gets,它已被弃用,如果您输入太长的输入,您会以未定义的行为写出接收字符串
  • 你的k循环没用
  • 您使用 int 但正确的类型是 size_t 因为 int 可能不够大

一种方法是修改字符串,假设您不想计算换行符,并更改打印结果的方式以使其更具可读性:

#include <stdio.h>

int main()
{
char a[20];

if (fgets(a, sizeof(a), stdin) != NULL) {
for (size_t j = 0; a[j] != 0; ++j) {
char c = a[j];

if (c != '\n') {
size_t count = 1;

for (size_t i = j + 1; a[i] != 0; i++) {
if (a[j] == a[i]) {
count += 1;
a[i] = '\n'; /* to not count it again */
}
}

printf("%c : %zu\n", a[j], count);
}
}
}

return 0;
}

编译和执行:

pi@raspberrypi:/tmp $ g++ -pedantic -Wall -Wextra c.c
pi@raspberrypi:/tmp $ ./a.out
tree
t : 1
r : 1
e : 2
pi@raspberrypi:/tmp $ ./a.outpi@
output input
o : 1
u : 3
t : 3
p : 2
: 1
i : 1
n : 1
pi@raspberrypi:/tmp $

如果你想管理包括换行符在内的所有字符,你可以记住循环字符串的初始长度,并使用字符 0 来标记已经计数的字符。当然,如果您不需要修改原始字符串,只需修改它的副本,或者使用包含字符数的附加数组(索引是字符的代码,如果字符已签名则发出警告),或者检查是否当前字符存在于之前的字符中

关于c - 如何打印字符串中字符的频率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56915323/

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