假设输入是
树
下面的代码显示了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);
}
}
最佳答案
你的代码有一些问题
不要使用get,它是不推荐使用的,如果输入的输入太长,则会用未定义的行为从接收字符串中写出
你和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/