[C] Spółgloski Samogłoski

ludozyad
Użytkownik
Użytkownik
Posty: 16
Rejestracja: 4 kwie 2015, o 22:38
Płeć: Mężczyzna
Lokalizacja: Rzeszów
Podziękował: 5 razy

[C] Spółgloski Samogłoski

Post autor: ludozyad »

Próbowałem napisać program który z wpisanego łańcucha tworzy łańcuch zrobiony z samogłosek lub spółgłosek, ale coś nie śmiga. Jakby ktoś mógł przejrzeć kod byłbym wdzięczny.

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>
char *szukaniesam(char *lan);
char *szukaniespol(char *lan);
int main()
{

  char *lan[80];
  char *lansam;
  char *lanspol;
  char a;
  printf("wpisz lancuch\n");
  scanf("%79[^\n]s",lan);
  printf("Wprowadziles lancuch:%s \n",lan);
  do
  {
  printf("wybierz:\na-samogloski\nb-spolgloski\nc-koniec\n");
  a=getchar();
  if(a=='a')
  {
    lansam=szukaniesam(lan);
    printf("Lancuch zlozony z samoglosek:\n%s",lansam);
  }
  else if(a=='b')
  {
    lanspol=szukaniespol(lan);
    printf("Lancuch zlozony z spolglosek:\n%s",lanspol);
  }
  else if(a=='c')
  {
      printf("KONIEC\n");
      break;
  }
  else
  {
      printf("wprowadziles zla litere, mozesz wpisac tylko a lub b lub c\n");
  }
  }while(1);
}


char *szukaniesam(char *lan)
{
char *wsk1=NULL;
int i,j;


for(i=0;i<strlen(lan);i++)
    if(lan[i]=='a'&&lan[i]=='e'&&lan[i]=='i'&&lan[i]=='o'&&lan[i]=='u'&&lan[i]=='y')
{
wsk1=(char*)realloc(wsk1,(i+1)*sizeof(char));
wsk1[j]=lan[i];
j++;
}
wsk1=(char*)realloc(wsk1,(i+1)*sizeof(char));
wsk1[j]='\n';

return wsk1;

}

char *szukaniespol(char *lan)
{
   char *wsk2=NULL;
int i,j;


for(i=0;i<strlen(lan);i++)
    if(lan[i]=='b'&&lan[i]=='c'&&lan[i]=='d'&&lan[i]=='f'&&lan[i]=='g'&&lan[i]=='h'&&lan[i]=='j'&&lan[i]=='k'&&lan[i]=='l'&&lan[i]=='m'&&lan[i]=='n'&&lan[i]=='p'&&lan[i]=='r'&&lan[i]=='s'&&lan[i]=='t'&&lan[i]=='w'&&lan[i]=='x'&&lan[i]=='z')
{
wsk2=(char*)realloc(wsk2,(i+1)*sizeof(char));
wsk2[j]=lan[i];
j++;
}
wsk2=(char*)realloc(wsk2,(i+1)*sizeof(char));
wsk2[j]='\n';

return wsk2;
}
majkz
Użytkownik
Użytkownik
Posty: 65
Rejestracja: 4 paź 2014, o 12:09
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 18 razy
Pomógł: 3 razy

[C] Spółgloski Samogłoski

Post autor: majkz »

Nawet nie wiem do czego się najpierw przyczepić.
Na szybko - wycinanie samogłosek z łańcucha znaków. Spróbuj sobie przeanalizować i porównać ze swoim.

Kod: Zaznacz cały

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

char* sam(char* napis);

int main(){
    const int N = 50;
    char napis[N];

    gets(napis);

    puts(napis);
    puts(sam(napis));

    return 0;
}

char* sam(char* napis){
    int dlugosc = strlen(napis);
    char* wynik = (char*)calloc(dlugosc, sizeof(char));

    char sam[5] = "aeiou";

    int i, j;
    for(i = 0; i < dlugosc; i++){
        for(j = 0; j < 5; j++)
            if(napis[i] == sam[j]) strncat(wynik, (napis+i), 1);
    }

    return wynik;
}
#Edit:
Jak później będę miał trochę więcej czasu, to napiszę co tam u Ciebie jest nie tak.

#Edit2:
Więc tak:

W linii 8 zadeklarowałeś tablicę 80 wskaźników na obiekty typu char. Każdy z tych wskaźników może pokazywać na inny łańcuch - Tobie potrzebny jest tylko jeden.
Scanf z linii 13 oczekuje literki "s" po przeczytaniu wszystkich, nie będących
, znaków z wejścia.
Poprawnie powinno być:

Kod: Zaznacz cały

scanf("%79[^
]
", input)
Dlaczego z dodatkowym new-linem? Bo w innym wypadku scanf zostawi go w buforze, a wtedy

Kod: Zaznacz cały

a=getchar()
nie zażąda od Ciebie żadnego znaku, tylko weźmie właśnie tego new-linea, który jak wspomniałem - będzie siedział w buforze.

Kolejna rzecz - ify z linii 49 i 69 nigdy się nie wykonają. Użyłeś w nich koniunkcji, a dany znak nigdy nie będzie jednocześnie i "a" i "e". Powinien być znak alternatywy.

Kod: Zaznacz cały

&& -> "i"
|| -> "lub"

Kod: Zaznacz cały

wsk2[j]=lan[i];
Takie operacje są niemożliwe do przeprowadzenia. Stringi w C są typu read-only. Nie możesz ich modyfikować, ale możesz doklejać jeden do drugiego. W moim kodzie - za pomocą funkcji strncat. Poczytaj sobie o bibliotece string.h - w niej są podane wszystkie możliwe operacje na stringach w C.
ODPOWIEDZ