Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Matt91111

[ROZWIĄZANY][C] Sortowanie alfabetyczne

Rekomendowane odpowiedzi

Chcę posortować alfabetycznie słowa pobrane od użytkownika przy użyciu funkcji qsort oraz strcmp.

Problem leży w tym, że funkcja strcmp dziwnie zachowuje się w przypadku wielkich liter, więc chciałem się ich pozbyć używając "tolower" (funkcja sortuj_slowa petla for) i tu właśnie leży problem. "tolower" wydaje się nie działać prawidłowo a na dodatek wrzuca mi jakieś losowe dane kiedy próbuje wyświetlić tablice. Bez używania dużych liter oraz skasowaniu for z zawartością z funkcji sortuj_slowa wszystko działa prawidłowo.

Byłbym wdzięczny za jakąś podpowiedź. :)

 

@PATRZ ZMODYFIKOWANY KOD PROGRAMU 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

putchar wyrzuca na konsole od razu jak chcesz zapisać do tablicy to moze tak:

for(int i = 0; i < n; i++){
  for(int j = 0; slowa[i][j]; j++){
     slowa[i][j] = tolower(slowa[i][j]);
  }
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

nie wiem jak mogłeś napisać, że działa prawidłowo jak nie działa :E

po uruchomieniu wywala oczywiście segmentation fault

 

w kodzie masz kilka bugów - ciekawe czy znajdziesz :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

nie wiem jak mogłeś napisać, że działa prawidłowo jak nie działa :E

po uruchomieniu wywala oczywiście segmentation fault

 

w kodzie masz kilka bugów - ciekawe czy znajdziesz :)

Code Blocks co innego twierdzi :P poza "tolower"

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

nie mówię o GUI tylko kompilatorze - ewidentnie piszesz po pamięci

Nie mam żadnych ostrzeżeń/błędów na etapie kompilacji, uruchamia mi się i działa bez problemowo. :hmm:

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

To sprawdź jak masz ustawione flagi kompilatora i dodaj Wall. Ale u mnie gcc nawet na domyślnych parametrach rzuca ostrzeżeniami, a program się wywala.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
' date='12 Styczeń 2017 - 14:44' timestamp='J' post='14469568']

To sprawdź jak masz ustawione flagi kompilatora i dodaj Wall. Ale u mnie gcc nawet na domyślnych parametrach rzuca ostrzeżeniami, a program się wywala.

-Wall Jest załączony, i mam 3 warny z czego jeden w stdlib.h, kolejny przy wywołaniu qsort i przy wywołaniu tolower.

qsort - incompatible pointer type --> qsort(..., ..., ..., strcmp)

tolower - implict declaration

 

@EDIT

Zapomniałem dodać, że kod programu wygląda trochę inaczj: :E

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include <stdbool.h>
#include <windows.h>

#define MAX_DL_SLOWA 50
#define SLOWA 3

//deklaracje funkcji
void pobierz_slowa(int n, char* slowa[]);
void sortuj_slowa(int n, char* slowa[]);
void wyswietl_slowa(int n, char* slowa[]);

int main(void) {
   char* slowa[sLOWA];
   pobierz_slowa(SLOWA, slowa);//pobieramy okreslona iloosc slow od uzytkownika
   sortuj_slowa(SLOWA, slowa);
   wyswietl_slowa(SLOWA, slowa);
   return 0;
}

void wyswietl_slowa(int n, char* slowa[]) {
   int i;
   for(i = 0; i < n; i++)
       printf("%s \n", slowa[i]);
   return;
}

void pobierz_slowa(int n, char* slowa[]) {
   int i;//licznik petli for
   for(i = 0; i < n; i++) {
       slowa[i] = malloc(MAX_DL_SLOWA); //Ustalamy dlugosc slowa
       printf("Wprowadz slowo %d z %d: \n", i + 1, n);
       scanf("%51s",//zapobiegamy sprowadzeniu wiekszej ilosci niz chcemy (50 + 1)
              slowa[i]);
       system("cls"); //czyscimy ekran
   }
   return;
}

void sortuj_slowa(int n, char* slowa[]) {
   int i, j = 0;

   for(i = 0; i < n; i++){
       for(j = 0; j < MAX_DL_SLOWA; j++) {
           slowa[i][j] = tolower(slowa[i][j]);
       }
   }
   /*
   char c;
   for(i = 0; i < n; i++) {
       while(slowa[i][j])
       {
           slowa[i][j] = tolower(slowa[i][j]);
           j++;
       }
   }
   */
   qsort(slowa, n, sizeof(MAX_DL_SLOWA * n), strcmp);
   return;
}

 

I jednak nie działa :/ ujowo sortuje

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

I jednak nie działa :/ ujowo sortuje

 

radzę przeczytać dokumentację jakie argumenty przyjmuje qsort ;)

 

base

Pointer to the first object of the array to be sorted, converted to a void*.

num

Number of elements in the array pointed to by base.

size_t is an unsigned integral type.

size

Size in bytes of each element in the array.

size_t is an unsigned integral type.

compar

Pointer to a function that compares two elements.

This function is called repeatedly by qsort to compare two elements. It shall follow the following prototype:

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

radzę przeczytać dokumentację jakie argumenty przyjmuje qsort ;)

 

base

Pointer to the first object of the array to be sorted, converted to a void*.

num

Number of elements in the array pointed to by base.

size_t is an unsigned integral type.

size

Size in bytes of each element in the array.

size_t is an unsigned integral type.

compar

Pointer to a function that compares two elements.

This function is called repeatedly by qsort to compare two elements. It shall follow the following prototype:

Czasami dobrze poczytać dokumentacje :E

Dzięki ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...