kopiowanie tablic char, odwrócone znaki wskaźnika **argv

0

**Pierwsze sprawa: **
moim celem jest napisanie programu zwracającego napis od tyłu.

działający kod wygląda tak:

-deklaruję zmienną pomocniczą
-za pomocą pętli przypisuję do nowej tablicy kolejne odwrotne znaki
-na końcu również za pomocą pętli for odczytuję kolejne znaki z tablicy

for(i=n;i>=0;i--)
		{
			tmp=napis[i];	
			nowynapis[n-i]=tmp;
		}
	for(i=1;i<=n;i++)
		printf("%c", nowynapis[i]); 

za pierwszym razem chciałem zrobić tak:

dużo szybciej i według mnie ma logiczny sens, nie wiem jednak czemu nie działa

 	int i;
 	char napis[]="ala ma kota";
	printf("%s\n", napis);

	int n = sizeof(napis)/sizeof(napis[0]);	//dlugosc tablicy napis

	char nowynapis[20];

	for(i=0;i<n;i++)
		nowynapis[i]=napis[n-i];
	printf("%s\n", nowynapis);
 

Druga sprawa to tablica argumentów funkcji main:

chciałbym odwrócić napis bezpośrednio z tablicy argv. tutaj byłem w stanie jedynie odwrócić kolejnością dane słowa. ale nie mam pojęcia jak zrobić aby odwrócić również znaki w pojedynczym słowie.

za pomocą argv[][] mogę dostać się do danego znaku, ale nie wiem jak je odwracać.

próbowałem również stworzyć dodatkową tablicę int, która miała za zadanie przechowywać długości pojedynczych słów ale funkcja sizeof nie działa na wskaźnikach, a jedynie na tablicach. znałbym wówczas długości danych słów i wykorzystałbym to do odwracania ( wiedziałbym kiedy ma się konczyć pętla), ale to zalatuje ogromnym kombinowaniem.

0

Ale po co to w ogóle przepisujesz? Nie możesz po prostu iterować od końca?

1
for(i=0;i<n;i++)
        nowynapis[i]=napis[n-i];

Tu jak i jest równe zero to kopiujesz z napis \0 na pierwsze miejsce w nowynapis, potem jak wyświetlasz w printf to wypisuje pusty napis bo na samym początku ma \0

funkcja sizeof nie działa na wskaźnikach, a jedynie na tablicach
To czemu nie użyjesz strlen()?

Troche kombinujesz za mocno chyba

	for( size_t i = argc - 1; i > 0; --i )
	{
		//odwroc napis argv[i]
		//wypisz odwrocony napis
		//wypisz spacje
	}
1
void  swapChar(char *a,char *b)  { char ch=*a; *a=*b; *b=ch; }
char *reverse(char *str)
  {
   char *p=str,*k=p+strlen(p)-1;
   while(p<k) swapChar(p++,k--);
   return str;
  }

int main()
  {
   char napis[]="ala ma kota";
   printf("%s\n",reverse(napis));
   return 0;
  }
0
_13th_Dragon napisał(a):
void  swapChar(char *a,char *b)  { char ch=*a; *a=*b; *b=ch; }
char *reverse(char *str)
  {
   char *p=str,*k=p+strlen(p)-1;
   while(p<k) swapChar(p,k);
   return str;
  }

int main()
  {
   char napis[]="ala ma kota";
   printf("%s\n",reverse(napis));
   return 0;
  }

deklarujesz char *k=p+strlen(p)-1;
dlaczego do typu char przypisujesz wskaźnik na p(char) i długość łańcucha p, która jest intem?
co w tym przykładzie znaczy while(p<k) ?
nie trzeba tego inkrementować w jakiś sposób, aby w funkcji swapChar przekazywać kolejne znaki p i k ?
wklepałem kod w kompilator i nic się nie dzieje.

1

Ad 1. Do wskaźnika możemy dodać int'a i będzie to przesunięcie tego wskaźnika o wskazaną ilość elementów.
Ad 2. Dopóki wskażnik na początek mniejszy od wskaźnika na koniec.
Ad 3. Trzeba, poprawiłem.

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