Zliczanie dużych i małych znaków

Odpowiedz Nowy wątek
2014-05-05 23:32
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?

Pozostało 580 znaków

2014-05-05 23:33

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2014-05-05 23:35
0

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

Pozostało 580 znaków

2014-05-05 23:37
0

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2014-05-05 23:41
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 ?

edytowany 3x, ostatnio: MoorfoxD, 2014-05-05 23:45

Pozostało 580 znaków

2014-05-06 00:05
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

Pozostało 580 znaków

2014-05-06 00:42
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;
}

PROGRAMY NA ZAMÓWIENIE, ZALICZENIA STUDENCKIE, KONFIGURACJA SERWERÓW, SYSTEMÓW I BAZ DANYCH, STRONY INTERNETOWE, POMOC W PROGRAMOWANIU, POPRAWIENIE I OPTYMALIZACJA APLIKACJI
JAVA, C++, LINUX, WWW, SQL, PYTHON
POSIADAM KOMERCYJNE DOŚWIADCZENIE
TANIO, SZYBKO I PORZĄDNIE
Z KOMENTARZAMI OBJAŚNIAJĄCYMI KOD
PISZ NA PRYWATNĄ WIADOMOŚĆ
CENY JUŻ OD 49,99ZŁ ZA PROGRAM
ZAJMIJ SIĘ TYM CO CIĘ NAPRAWDĘ INTERESUJE!
p1 i p2 kiepskie nazewnictwo, już może lepiej p i q. p2 = str + strlen(str) - 1 == p2=strchr(str,0)-1 - _13th_Dragon 2014-05-06 01:05
no ale to trzeba byłoby pisać do Mr.Stdout http://www8.cs.umu.se/~isak/snippets/strrev.c :P - karolinaa 2014-05-06 01:10
Pamiętaj że internet to wielki śmietnik, co jest śmieciem a co nie nie wiadomo, trzeba za każdym razem się zastanawiać ;P - _13th_Dragon 2014-05-06 01:13
wiem wiem ;] - karolinaa 2014-05-06 13:14

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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