按用户输入C的顺序返回ASCII字符的计数

时间:2019-04-12 00:46:01

标签: c arrays character ansi

我需要按用户输入接收到的字符数组中的出现顺序返回一个ASCII字符计数

我当前的解决方案是按字符在ASCII表上的升序而不是用户输入的顺序返回字符

#include <stdio.h>
#include <string.h>

int main()
{
  char string[16];
  int c = 0, count[128] = {0}, x, counted = 0;

  printf("Enter a word>\n");
  scanf("%s", string);

  while (string[c] != '\0') {
    if(string[c] >= '!' && string[c] <= '~'){
      x = string[c] - '!';
      count[x]++;
    }
    c++;
  }

  for (c = 0; c < 128; c++){
    if(count[c] > 1){
    printf("Duplicate letter: %c, Occurrences: %d\n", c + '!', count[c]);
      counted++;
    }
  }

  if(counted < 1){
    printf("No duplicates found\n");
  }
  return 0;
}

示例输入:

AAAAaaaaBBBbb99

所需的输出:

重复的字母:A,出现次数:4
重复的字母:a,出现次数:4
重复的字母:B,出现次数:3
重复的字母:b,出现的次数:2
重复的字母:9,出现次数:2

我当前的(错误的)输出:

重复字母:9,出现次数:2
重复的字母:A,出现次数:4
重复的字母:B,出现次数:3
重复的字母:a,出现次数:4
重复的字母:b,出现的次数:2


非常感谢这里的任何帮助

1 个答案:

答案 0 :(得分:0)

这不是一个非常优雅的解决方案,但它可以工作:

#include <stdio.h>
#include <string.h>

int main() {
    char string[1024];
    int c = 0;
    int count[128] = {0};
    int x;
    int counted = 0;

    printf("Enter a word:\n");
    scanf("%1023s", string);

    while (string[c] != '\0') {
        if(string[c] >= '!' && string[c] <= '~'){
            x = string[c] - '!';
            count[x]++;
        }
        c++;
    }

    int j = 0;
    while (string[j] != '\0') {
        int ch = string[j] - '!';

        if(count[ch] > 1){
            printf("Duplicate letter: %c, Occurrences: %d\n", ch + '!', count[ch]);
            count[ch] = -1;
            counted++;
        }

        j++;
    }

    if(counted < 1){
        printf("No duplicates found.\n");
    }

    return 0;
}