Zadanie z sortowaniem tablic tekstów - segmentation fault (core dumped)

0

Potrzebuje pomocy z tym kodem , wywala mi ciągle błąd segmentation fault (core dumped) , nie moge go znaleźć.
Cały program sklada się z 3 plików i ma sortować tablice których komórki zawierają tekst.
Jestem początkującym programistą więc proszę o wyrozumiałość i pomoc :)

**DEKLARACJA FUNKCJI **

#ifndef sortstr_h
#define sortstr_h
char **sortstr (char **tab, int size);
#endif

GŁÓWNY PROGRAM

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


void instruction(){
    
           printf("\nzad17\n");
           printf("usage: ./zad17 -n name\n\nn");
           printf("name:\n");
           printf("sortstr - for sort string\n\n");
}

int main(int argc, char **argv){
       int size=0;
       char** tabz;
       // char *tabz[] = {"ala", "slon","slon2", "AGH", "mjhngvukybjnj.kunlu", "piwo"};
       

        if(argc!=3){
                instruction();
                return -1;
        }
        
        
        if(strcmp(argv[1],"-n")==0 && strcmp(argv[2],"sortstr")==0){
            printf("\n\nPodaj rozmiar tablicy\n");
            scanf("%d",&size);
             tabz = (char**)malloc(size*sizeof(char*));
             printf("\n");
             printf("\nTo jest ilośc slow które mozesz wpisac %d\n",size);
             printf("\nWpisz slowa ktore chcesz posortowac wciskajac enter po kazdej:\n\n");
        
             for(int i=0; i<size; i++) {
             scanf("%s",&tabz[i]);
             }
                 sortstr (tabz,size);
                 for(int i = 0; i < size; i++){
                        printf("%s\n", tabz[i]);
                }
                return 0;
        }
        free(tabz);
       
     
}




**
FUNKCJA SORTUJĄCA**

#include"sortstr.h"
#include<string.h>

char **sortstr (char **tab, int size){
       int i, j;
       char *temp;
       for (i = 0; i<size-1; i++)
        {
                for (j=0; j<size-1-i; j++)
                {
                        if (strcmp(tab[j],tab[j+1])>0)
                        {
                                temp = tab[j+1];
                                tab[j+1] = tab[j];
                                tab[j] = temp;
                        }
                }
        }
  return tab;
}

0

Musisz zaalokować pamięć dla każdego wczytywanego stringa, bo na razie zaalokowałeś tylko pamięć dla tablicy wskaźników, a te wskaźniki muszą wskazywać na coś, co istnieje (teraz wskazują na jakieś losowe miejsca w pamięci (bądź na NULL czyli 0, zależnie od opcji kompilacji), do których nie masz dostępu, a do których próbujesz coś zapisać, więc dostajesz segfault (czyli naruszenie ochrony pamięci)):

char buf[0x1000] = {'\0'}; // bufor, do którego wczytujemy stringa
for (int i = 0; i < size; i++)
{
      scanf("%s", buf);

      // alokacja pamięci o rozmiarze pobranego stringa
      // + 1 dla znaku końca stringa ('\0')
      tabz[i] = calloc(strlen(buf) + 1, sizeof(char)); 

      // kopiujemy zawartość bufora do tablicy
      // istnieją lepsze sposoby, ale to już sobie poczytaj
      strcpy(tabz[i], buf); 
}
0

Mógłbyś mi to włozyć w cały kod ? bo pewnie cos gdzies trzeba jeszcze dopisać ale nie czaje gdzie ?
plus jszcze mam pytanie co oznacza to [0x1000]?

0

to co tutaj jest jeszcze źle ?
bo wywala segf


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


void instruction(){
    
           printf("\nzad17\n");
           printf("usage: ./zad17 -n name\n\nn");
           printf("name:\n");
           printf("sortstr - for sort string\n\n");
}

int main(int argc, char **argv){
       int size=0;
       char** tabz;
       // char *tabz[] = {"ala", "slon","slon2", "AGH", "mjhngvukybjnj.kunlu", "piwo"};
       

        if(argc!=3){
                instruction();
                return -1;
        }
        
        
        if(strcmp(argv[1],"-n")==0 && strcmp(argv[2],"sortstr")==0){
            printf("\n\nPodaj rozmiar tablicy\n");
            scanf("%d",&size);
            
             printf("\nWpisz slowa ktore chcesz posortowac wciskajac enter po kazdej:\n\n");
             char buf[0x1000] = {'\0'}; 
               for (int i = 0; i < size; i++)
             {
              scanf("%s", buf);

              
                  tabz[i] = calloc(strlen(buf) + 1, sizeof(char)); 

                   strcpy(tabz[i], buf); 
}
             
             
             
                 sortstr (tabz,size);
                 for(int i = 0; i < size; i++){
                        printf("%s\n", tabz[i]);
                }
                return 0;
        }
       
       free(tabz);
     
}
0

oj kurde mój błąd :) sorki

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