Program pobiera wyraz i dzieli na male i duze.

0

Witam program mi się wiesza ale nie pokazuje błędów.

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

int main()
{
    char wpisz[10];
    char str1male[10];
    char str2duze[10];
    int i,j;



            scanf("%s",&wpisz[10]);


        for(i=0;i<10;i++)
        {
            if(wpisz[i]<=122 && wpisz[i]>=97)
            {
                for(j=0;j<=10;j++)
                {
                    wpisz[i]=str1male[j];
                }

            }
            else if (wpisz[i]>=65&&wpisz[i]<=90)
            {
                for(j=0;j<=10;j++)
                {
                    wpisz[i]=str2duze[j];
                }

            }
        }

        for(i=0;i<10;i++)
        {
            printf("%s\n",str1male[i]);
        }

    return 0;
}
1
scanf("%s",&wpisz[10]);

Próbujesz zmusić scanf do umieszczenia znaków poza tablicą.
Zamień to na:

scanf("%s", wpisz);

To zadziała dlatego że przekazywanie tablicy to tak naprawdę przekazywanie wskaźnika na pierwszy element, więc równie dobrze można byłoby to zapisać tak:

Poza tym zamiast używania 122 i 97 możesz po prostu użyć 'z' i 'a' - wtedy twoje zamiary będą jaśniejsze.

0
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char wpisz[10];
    char str1male[10];
    char str2duze[10];
    int i,j;



            scanf("%s",&wpisz);


        for(i=0;i<10;i++)
        {
            if(wpisz[i]=='a' || wpisz[i]=='b')
            {
                for(j=0;j<=10;j++)
                {
                    wpisz[i]=str1male[j];
                }

            }
            else if (wpisz[i]=='A' || wpisz[i]=='B')
            {
                for(j=0;j<=10;j++)
                {
                    wpisz[i]=str2duze[j];
                }

            }
        }

        for(i=0;i<10;i++)
        {
            printf("%s\n",str1male[i]);
        }

    return 0;
}

Przy takiej konfiguracji podaje mi (null).

1

Ale nie mówiłem o zamianie >= na ==.
Możesz potraktować char jak liczbę (bo koniec końców nią jest):

if(wpisz[i] >= 'a' && wpisz[i] <= 'b') { ... }

else if (wpisz[i] >= 'A' && wpisz[i] <='B') { ... }

Zauważyłem jeszcze jeden problem - masz tablice o rozmiarze 10. Pierwszy element takiej tablicy znajduje się pod indeksem 0, ostatni zaś pod indeksem 9, w takim razie te pętle są nieprawidłowe:

for(j=0;j<=10;j++)

Bo lecą od 0 (włącznie) do 10 (włącznie)

0

Nadal dostaję nulla. Racja z ta tablicą i 10 wiec zmienilem i zmieniłem znowu na dziesiętny. Nie pokazuje mi żadnego błędu więc nie wiem co jest grane.

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

int main()
{
    char wpisz[10];
    char str1male[10];
    char str2duze[10];
    int i,j;



        scanf("%s",&wpisz);


        for(i=0;i<10;i++)
            {
            if(wpisz[i]<=122 && wpisz[i]>=97)
            {
                for(j=0;j<=10;j++)
                {
                    wpisz[i]=str1male[j];
                }

            }
            else if (wpisz[i]>=65&&wpisz[i]<=90)
            {
                for(j=0;j<=10;j++)
                {
                    wpisz[i]=str2duze[j];
                }

            }
            }

        for(i=0;i<10;i++)
        {
            printf("%s\n",str1male[i]);
        }

    return 0;
}
1

Zamiast przypisywać znaki z wpisz do str1male robisz odwrotnie, przypisujesz rzeczy z str1male do wpisz:

wpisz[i] = str1male[j];
0
#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define BUFFER_MAX 20

int main()
{
   char buffer[ BUFFER_MAX ];
   char lower[ BUFFER_MAX ];
   char upper[ BUFFER_MAX ];
   int i, idx_lower = 0, idx_upper = 0;
   printf( "Napisz cos: " );
   fgets( buffer, BUFFER_MAX, stdin );
   for (i = 0; i < strlen(buffer); ++i) {
      if (isalpha(buffer[i])) {
         if (isupper(buffer[i])) {
            upper[ idx_upper++ ] = buffer[ i ];
         }
         else {
            lower[ idx_lower++ ] = buffer[ i ];
         }
      }
   }
   lower[ idx_lower ] = '\0';
   upper[ idx_upper ] = '\0';

   puts( "Wynik:" );
   printf( "Male litery: %s\n", lower);
   printf( "Wielkie litery: %s\n\n", upper);
   return 0;
}
0

strasznie mało z tego rozumiem.

 for (i = 0; i < strlen(buffer); ++i) {
      if (isalpha(buffer[i])) {
         if (isupper(buffer[i])) {
            upper[ idx_upper++ ] = buffer[ i ];
         }
         else {
            lower[ idx_lower++ ] = buffer[ i ];
         }
      }
   }
1

W scanf miało być bez &:

scanf("%s", wpisz);

W printf używasz ciąg znaków jako format (%s) a podajesz znak, powinieneś użyć formatu %c:

printf("%c\n", str1male[i]);

Pętle nadal widzę j <= 10.

Twój kod nie działa również dlatego że gdy użytkownik wpisze 9 literowy wyraz to każda litera będzie przypisywana do wszystkich elementów w tablicy str1male albo str2duze co oznacza że gdy wpiszemy wyraz winogrono tablica str1male będzie wyglądała tak:

oooooooooo

Wpisanie 10 literowego wyrazu spowoduje buffer overflow bo nie ma tyle miejsca w tablicy wpisz a 10 znakiem (indeks 9) musi być \0.

Problem pojawia się również wtedy kiedy ktoś wpisze 7 znaków, wtedy 8 znakiem jest \0 a 9 oraz 10 nie wiadomo co (śmieci z pamięci), jednak Twój program i tak będzie odczytywał te rzeczy bo tak jest napisany (pierwsza pętla for).

0

Dla hasla haszTAG pokazuje mi 10xz i 10xG :(

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

int main()
{
    char wpisz[10];
    char str1male[10];
    char str2duze[10];
    int i,j;



        scanf("%s",wpisz);


        for(i=0;i<strlen(wpisz);i++)
            {
            if(wpisz[i]<=122 && wpisz[i]>=97)
            {
                for(j=0;j<=10;j++)
                {
                    str1male[j]=wpisz[i];
                }

            }
            else if (wpisz[i]>=65&&wpisz[i]<=90)
            {
                for(j=0;j<10;j++)
                {
                    str2duze[j]=wpisz[i];
                }

            }
            }

        for(i=0;i<10;i++)
        {
            printf("%c\n",str1male[i]);
        }
        for(i=0;i<10;i++)
        {
            printf("%c\n",str2duze[i]);
        }


    return 0;
}
1

Masz tak (pseudokod):

wpisz[10]
str1male[10]
str1duze[10]

wpisz = get_input()

for i from 0 to 10: # Pętla dla wpisz która leci litera po literze
	if wpisz[i] is lowercase_alpha: # Sprawdzanie czy znak jest małą literą
		for j from 0 to 10: # Od 0 do 10 dla tablicy str1male
			str1male[j] = wpisz[i] # Zapełnianie całej tablicy tym znakiem

Nadal masz pętle:

for(j=0;j<=10;j++)

tam gdzie sprawdzasz czy 97 ≥ wpisz[i] ≥ 122.

1

Żeby nie wypisywać tego samego znaku mógłbyś zrobić tak że przed pierwszą pętlą deklarujesz 2 zmienne, nazywasz je lower_index i upper_index, wtedy używasz to tak:

int main()
{
    ... // Tablice
    
    int lower_index = 0;
    int upper_index = 0;

    scanf("%s", wpisz);

    for (int i = 0; i < strlen(wpisz); i++)
    {
        if (wpisz[i] <= 'z' && wpisz[i] >='a')
        {
            str1male[lower_index++] = wpisz[i];
        }
    }
}

Taka sama zasada będzie dla dużych liter.

0

Miałem jeszcze po drodzę problem ale juz poradziłem, wszystko jest ok także bardzo dziękuję za pomoc i cierpliwość.

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