sortowanie wyrazów na wejściu jezyk C

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

void sortuj(char *tb, int rzm)
{
  int i, j;
  char tmp;
  for (i=1; i<rzm; i++)
    for (j=rzm-1; j>=i; j--)
	if (tb[j]<tb[j-1])
        {
	     tmp=tb[j-1];
             tb[j-1]=tb[j];
             tb[j]=tmp;
        }
}

int main(int argc, char *argv[])
{
char a[argc];
int i = 0;

    if(argc == 1 || argc == 2)
    {
        printf("Nie podales zadnych wyrazow, lub podales ich za malo\n");
        exit (2);
    }

for(i=0; i<=argc; i++)
    a[i] = argv[i];


sortuj(a,argc);
    printf("Oto twoje posortowane wyrazy\n");
    for(i=0; i<=argc; i++)
		printf("%s",a[i]);

return 0;
}

Wyrzuca mi błąd przy przepisywaniu tych wyrazów z argv do a,

błąd: warning: assignment makes integer from pointer without a cast [enabled by defauld]

Jestem początkującym nie wiem co mam źle.
Z góry dzięki za pomoc

5
  1. Zapoznaj się z pojęciem formatowania kodu: http://4programmers.net/Forum/998482
  2. Nie nadużywaj inkrementacji przyrostkowej: http://4programmers.net/Forum/1101404 for(int i=1;i<n+1;++i) - zadziała tak samo ale uchroni przed ewentualnymi problemami
  3. Tu: for(i=0; i<=argc; i++) a[i]= - wyłazisz poza przydzieloną pamięć, a zadeklarowano na argc elementów czyli od 0 do argc-1
  4. Tu: a[i] = argv[i]; - próbujesz napis wepchnąć w jeden znak.
  5. Tu: printf("%s",a[i]); - próbujesz znak wyświetlić jako napis
2
a[i] = argv[i];

To nie ma sensu. Nie widzisz różnicy między char *argv[] a char a[argc]; ? Pierwsze to tablica wskaźników do char a drugie to tablica charów. Każdy element tablicy argv jest stringiem. Każdy element tablicy a to JEDEN ZNAK. Twój warning mówi właśnie o tym że przypisujesz sobie wesoło wskaźnik do stringu z argv do jednego znaku z tablicy a. Kompiluje się to tylko dlatego że zarówno wskaźnik jak i chara można uznać za liczbę ;]
2.

for(i=0; i<=argc; i++)
    a[i] = argv[i];

Tu juz masz błąd off-by-one bo żadna z tych tablic nie ma indeksu o wartości argc. Obie mają indeksy od 0 do argc-1. Nierówność powinna być nieostra.
To samo niżej gdzie robisz printf.

2

komunikat chyba jest oczywisty.
Twoje a ma zły typ.

powinno być tak:

int main(int argc, char *argv[])
{
    const char **a;
    int i;

    if (argc<3) {
         fprintf(stderr, "Za mało argumentów, wymagane jest minimum dwa.\n");
         return 1;
    }
    a = calloc(argc-1, sizeof(*argv));
    for (i=1; i<argc; ++i) {
         a[i-1] = argv[i];
    }

    sortStrings(a, argc-1);
    printStrings(a, argc-1);

    free(a);

    return 0;
}
1

Tak sobie pomyślałem, po kiego to gdzieś kopiujesz?

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

int cmp(const void *a,const void *b) { return strcmp(*(const char**)a,*(const char**)b); }

int main(int argc, char *argv[])
  {
   int i;
   qsort(argv+1,argc-1,sizeof(char*),cmp);
   printf("Oto twoje posortowane wyrazy:\n");
   for(i=1;i<argc;++i) puts(argv[i]);
   return 0;
  }

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