wypisanie ilości wystąpienia liter

0

Cześć mam mały problem z przerobieniem tego programu-otóż muszę napisać program który wypisuje jak często wystąpiła dana litera bez względu na jej wielkość.
Zrobiłem program który działa jednak rozróżnia małe i wielkie litery a powinien zliczać je razem

#include <stdio.h>
#include <stdlib.h>
int main(void) 
{
char zdanie[1000];
int litera[123] = {0};
printf("wprowadź zdanie: ");
fgets(zdanie,1000,stdin);
int i=0;
  while(zdanie[i] || zdanie[i]!=0)
    {
      ++litera[zdanie[i]];
      ++i;
    }
        
  for(int i=97;i<123;i++)
    {
      printf("%c - %d\n",i,litera[i]);
    }
                        
  for(int i=65;i<91;i++)
    {
      printf("%c - %d\n",i,litera[i]); 
    }
return 0;
}
1

Z ctypes: tolower może pomóc.

1
zdanie[i] || zdanie[i]!=0

To jest redundantne.

0

Tu jest prostsze rozwiązanie, które działa na liniach o dowolnej długości (nie do końca... Działa dobrze tylko jeśli żaden ze znaków nie powtarza się częściej niż 127 razy, ale ten limit można łatwo zwiększyć... jeśli jest sens):

#include <ctype.h>
#include <stdio.h>

int  main(void)
{
    char  chr, histogram[255] = {0};

    while ( (chr = getchar()) > 0 && chr != '\n' )
        histogram[toupper(chr)]++;

    for ( int idx = 0; idx < (int)sizeof(histogram); idx++ )
        if ( histogram[idx] )
            printf("%c: %d\n", idx, histogram[idx]);

    return 0;
}
0

ogólnie teraz zrobiłem taki kod, który działa w kompilatorach, lecz program sprawdzający wyrzuca taki błąd:
** error: array subscript has type ‘char’ [-Werror=char-subscripts]
++litera[zdanie[i]];
^**
i nie mam najmniejszego pojęcia o co chodzi

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void) 
{
char zdanie[1001];
unsigned char litera[123] = {0};
printf("wprowad zdanie: ");
fgets(zdanie,1001,stdin);
int i=0;
  while(zdanie[i])
    {
      zdanie[i]=tolower(zdanie[i]);
      ++litera[zdanie[i]];
      ++i;
    }
        
  for(int i=97;i<123;i++)
    {
      printf("%c - %d\n",i,litera[i]);
    }
}
1

zdanie[i] ma typ char, bo tak Zadeklarowałeś: char zdanie[1001]; i Używasz go jako indeks w ++litera[zdanie[i]];, co nie jest dobre - indeks jest liczba naturalną.

EDIT: Spróbuj: ++litera[(int)zdanie[i]];.

1
kamiloo2k napisał(a):

ogólnie teraz zrobiłem taki kod, który działa w kompilatorach, lecz program sprawdzający wyrzuca taki błąd:
** error: array subscript has type ‘char’ [-Werror=char-subscripts]
++litera[zdanie[i]];
^**

żeby było jasne to nie jest błąd!
Po prostu, masz tak skonfigurowany kompilator, by traktował ostrzeżenie jak błąd -Werror=char-subscripts.

0
	unsigned hist['Z'-'A'+2]={};
	for(char ch;(ch=getchar())!=EOF;++hist[isalpha(ch)?toupper(ch)-'A'+1:0]) {}
	for(char ch='A';ch<='Z';printf("%c: %u\n",ch,hist[ch-'A'+1]),++ch) {}

https://ideone.com/fPnrkk#stdin

1 użytkowników online, w tym zalogowanych: 0, gości: 1