Count the number of occurrences of each letter in string

前端 未结 15 1952
别跟我提以往
别跟我提以往 2020-12-10 20:02

How can I count the number of occurrences in c of each letter (ignoring case) in the string? So that it would print out letter: # number of occurences, I have c

相关标签:
15条回答
  • 2020-12-10 20:36

    One simple possibility would be to make an array of 26 ints, each is a count for a letter a-z:

    int alphacount[26] = {0}; //[0] = 'a', [1] = 'b', etc
    

    Then loop through the string and increment the count for each letter:

    for(int i = 0; i<strlen(mystring); i++)      //for the whole length of the string
        if(isalpha(mystring[i]))
            alphacount[tolower(mystring[i])-'a']++;  //make the letter lower case (if it's not)
                                                     //then use it as an offset into the array
                                                     //and increment
    

    It's a simple idea that works for A-Z, a-z. If you want to separate by capitals you just need to make the count 52 instead and subtract the correct ASCII offset

    0 讨论(0)
  • 2020-12-10 20:37

    After Accept Answer

    A method that meets these specs: (IMO, the other answers do not meet all)

    1. It is practical/efficient when char has a wide range. Example: CHAR_BIT is 16 or 32, so no use of bool Used[1 << CHAR_BIT];

    2. Works for very long strings (use size_t rather than int).

    3. Does not rely on ASCII. ( Use Upper[] )

    4. Defined behavior when a char < 0. is...() functions are defined for EOF and unsigned char

      static const char Upper[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
      static const char Lower[] = "abcdefghijklmnopqrstuvwxyz";
      
      void LetterOccurrences(size_t *Count, const char *s) {
        memset(Count, 0, sizeof *Count * 26);
        while (*s) {
          unsigned char ch = *s;
          if (isalpha(ch)) {
            const char *caseset = Upper;
            char *p = strchr(caseset, ch);
            if (p == NULL) {
              caseset = Lower;
              p = strchr(caseset, ch);
            }
            if (p != NULL) {
              Count[p - caseset]++;
            }
          }
        }
      }
      
      // sample usage
      char *s = foo();
      size_t Count[26];
      LetterOccurrences(Count, s);
      for (int i=0; i<26; i++)
        printf("%c : %zu\n", Upper[i], Count[i]);
      }
      
    0 讨论(0)
  • 2020-12-10 20:38

    //c code for count the occurence of each character in a string.

    void main()
       {
       int i,j; int c[26],count=0; char a[]="shahid";
       clrscr();
       for(i=0;i<26;i++)
        {
            count=0;
              for(j=0;j<strlen(a);j++)
                    {
                     if(a[j]==97+i)
                        {
                         count++;
                             }
                               }
                      c[i]=count;
                   }
                  for(i=0;i<26;i++)
                   {
                  j=97+i;
              if(c[i]!=0) {  printf("%c of %d times\n",j,c[i]);
                     }
                  }
               getch();
               }
    
    0 讨论(0)
  • 2020-12-10 20:41
    protected void btnSave_Click(object sender, EventArgs e)
        {           
            var FullName = "stackoverflow"
    
            char[] charArray = FullName.ToLower().ToCharArray();
            Dictionary<char, int> counter = new Dictionary<char, int>();
            int tempVar = 0;
            foreach (var item in charArray)
            {
                if (counter.TryGetValue(item, out tempVar))
                {
                    counter[item] += 1;
                }
                else
                {
                    counter.Add(item, 1);
                }
            }
            //var numberofchars = "";
            foreach (KeyValuePair<char, int> item in counter)
            {
                if (counter.Count > 0)
                {
                    //Label1.Text=split(item.
                }
                Response.Write(item.Value + " " + item.Key + "<br />");
                // Label1.Text=item.Value + " " + item.Key + "<br />";
                spnDisplay.InnerText= item.Value + " " + item.Key + "<br />";
            }
    
        }
    
    0 讨论(0)
  • 2020-12-10 20:42
    for (int i=0;i<word.length();i++){
             int counter=0;
             for (int j=0;j<word.length();j++){
                 if(word.charAt(i)==word.charAt(j))
                 counter++;
                 }// inner for
                 JOptionPane.showMessageDialog( null,word.charAt(i)+" found "+ counter +" times");
             }// outer for
    
    0 讨论(0)
  • 2020-12-10 20:43

    Let's assume you have a system where char is eight bit and all the characters you're trying to count are encoded using a non-negative number. In this case, you can write:

    const char *str = "The quick brown fox jumped over the lazy dog.";
    
    int counts[256] = { 0 };
    
    int i;
    size_t len = strlen(str);
    
    for (i = 0; i < len; i++) {
        counts[(int)(str[i])]++;
    }
    
    for (i = 0; i < 256; i++) {
        if ( count[i] != 0) {
            printf("The %c. character has %d occurrences.\n", i, counts[i]);
        }
    }
    

    Note that this will count all the characters in the string. If you are 100% absolutely positively sure that your string will have only letters (no numbers, no whitespace, no punctuation) inside, then 1. asking for "case insensitiveness" starts to make sense, 2. you can reduce the number of entries to the number of characters in the English alphabet (namely 26) and you can write something like this:

    #include <ctype.h>
    #include <string.h>
    #include <stdlib.h>
    
    const char *str = "TheQuickBrownFoxJumpedOverTheLazyDog";
    
    int counts[26] = { 0 };
    
    int i;
    size_t len = strlen(str);
    
    for (i = 0; i < len; i++) {
        // Just in order that we don't shout ourselves in the foot
        char c = str[i];
        if (!isalpha(c)) continue;
    
        counts[(int)(tolower(c) - 'a')]++;
    }
    
    for (i = 0; i < 26; i++) {
        printf("'%c' has %2d occurrences.\n", i + 'a', counts[i]);
    }
    
    0 讨论(0)
提交回复
热议问题