假设输入是

下面的代码显示了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/

10-12 16:22
查看更多