Zliczanie dużych i małych znaków

0

Witam, chcę zliczyć duże i małe znaki w tekście. Mam takie coś:

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

int main()
{
    char str[100];
    int i;
    int upper = 0, lower = 0;

    puts("Podaj ciag znakow: ");
    fgets(str, sizeof str, stdin);

    for(i=0; i < sizeof str; i++) {
        if(str[i] != EOF) {
            if(isupper(str[i])) {
                upper++;
            } else if(islower(str[i])) {
                lower++;
            }
        }
    }
    printf("Duze litery: %d\nMale litery: %d", upper, lower);

    return 0;
}

Dla danych "Ala ma kota" wyświetla mi:
Duze litery: 4
Male litery: 18
Co jest źle w tym programie?

1

for(i=0;str[i];++i)

0

Super, działa. Możesz mi wyjaśnić dlaczego tak ma być?

0

Ponieważ szukać musisz nie w całych 100 bajtach zaś tylko we wprowadzonym odcinku.

1

Prawdopodobnie chodzi mu o to, że sizeof(string) zwroci nie poprawna wartosc a str[i] to to samo co str[i] == 0 a 0 jest znakiem konczonczym string czyli teraz petla wykona sie tyle razy ile wynosi dlugosc stringa
EDIT:
Jak tworzysz tablice char tab[100] to sizeof(tab) = 100 nie dlugosci stringa tylko rozmiarowi tablicy :P
Jeszcze jedno zebys dokladnie zrozumial for(x;y;z) y -- to jest warunek kiedy bedzie false lub jak wolisz 0 to wtedy petla sie konczy jak juz pisalem 0 jest znakiem konca stringa wiec jesli on bedize wynosil 0 to warunek jest false prawda :P ?

0

Dobra, dzięki za wyjaśnienie. Mam jeszcze jeden problem. Teraz muszę odwrócić łańcuch. Mam coś takiego

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define size 100
int main()
{
    char str[size];

    puts("Podaj ciag znakow: ");
    fgets(str, sizeof str, stdin);

    Hcucnal(&str);
    printf("%s",str);

    return 0;
}

void Hcucnal( char *s ) {
    int i;
    int m = 0;
    char str2[size];

    for(i = size - 1; i>=0; i--) {
        if (s[i]!='\0') {
            str2[m]=s[i];
            m++;
        }
    }
    for (i=0;i<size;i++) {
        s[i]=str2[i];
    }
}

I dostaję takie coś:
user image
Wydaje mi się, że znowu o to chodzi, że robię to po całej długości stringa ale teraz nie mam pojęcia jak to zamienić aby operować tylko we wprowadzonym odcinku

1

poczytaj o stringach w C. Np. możesz użyć strlen

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

size_t count_(int(*is_)(int),const char *str) {
	size_t i, count = 0;
	for(i=0; str[i]; ++i) {
		if(is_(str[i]))
			++count;
	}
	return count;
}

char *strrev(char *str) {
	char *p1, *p2;
	if (! str || ! *str)
		return str;
	for (p1 = str, p2 = str + strlen(str) - 1; p2 > p1; ++p1, --p2) {
		*p1 ^= *p2;
		*p2 ^= *p1;
		*p1 ^= *p2;
	}
	return str;
}

int main(void) {
	char *str = NULL;
	size_t upper, lower, len = 0;
	printf("Podaj ciag znakow: ");
	getline(&str,&len,stdin);

	upper = count_(isupper,str);
	lower = count_(islower,str);
	printf("Duze litery: %d\nMale litery: %d\n", upper, lower);

	printf("Odwrocony: %s\n",strrev(str));

	free(str);
	return 0;
}

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