odwracanie i porownywanie lancuchow

0
int main(int argc, char *argv[]) {
	int i,j,dlugosc;
	char napis1[10];
	char napis2[10];
	
	gets(napis1);
	dlugosc=strlen(napis1);
	

	
		
		for(i=dlugosc;i>=0;i++)
		{
			for(j=0;j<=dlugosc;j++)
			napis1[i]=napis2[j];
		}
		printf("%s",napis2);
				if(strcmp(napis1,napis2)==0)
				{printf("true");
				}
		

	return 0;
}

nw po prostu sie zacina nw co mam zrobic podejrzewam ze cos sie chrzani w petli ktora ma odwracac ale nw szczerze dlaczego.

0

Jakbyś pisał w C++ to wystarczyłoby coś takiego

#include <string>
#include <algorithm>
#include <iostream>

int main()
{
    std::string base("napis");
    std::string reversed(base.rbegin(), base.rend());
    std::cout << reversed << "\n";
    return 0;
}

I żadna pętla nie jest potrzebna.
Wracając do Twojego kodu, zacząłem pisać co jest z nim nie tak, ale jest tego tyle, że mi się odechciało. Wygląda jakbyś niechlujnie go skądś skopiował. Zalecam powrót do literatury.

EDIT
No dobra, coś napisze.

  • strlen zwróci Ci rozmiar do nullptr, tak więc maksymalnie testuj z 9 znakami
  • w pierwszej pętli iterujesz od indeksu równemu długości stringa, tak więc zaczynasz od nullptr którego nie chcesz na początku tablicy no i inkrementujesz indeks zamiast go dekrementować więc przepisujesz jakieś śmieci nie wiadomo skąd
  • druga pętla nie dość że błędna do tego w ogóle nie potrzebna, usuń ją w całości, dodaj nową zmienną zaczynającą się od zera która będzie Twoim indeksem dla drugiej tablicy i po prostu z każdą iteracją pierwszej pętli ją inkrementuj

Spróbuj zaaplikować te trzy punkty i pokaż co Ci wyszło.

1

Sformatuj to ładnie to łatwiej będzie analizować:

int main(int argc, char *argv[]) {
	int i, j, dlugosc;
	char napis1[10];
	char napis2[10];

	gets(napis1);
	dlugosc = strlen(napis1);

	for (i = dlugosc; i >= 0; i++)
	{
		for (j = 0; j <= dlugosc; j++)
			napis1[i] = napis2[j];
	}

	printf("%s", napis2);
	if (strcmp(napis1, napis2) == 0)
	{
		printf("true");
	}
	return 0;
}

A zacina się z bardzo prostego powodu:

for (i = dlugosc; i >= 0; i++)

Zamiast dekrementować i to je inkrementujesz. Pomijając już fakt że wychodzisz poza maksymalny indeks.

Zobacz co robisz:

  • Wczytujesz napis od użytkownika do zmiennej napis1.
  • Nadpisujesz napis1 śmieciami z napis2 (w pętli for).

Wszystko dlatego że te nazwy zmiennych są złe, gdybyś miał coś takiego:

const int size;
char original[size];
char reversed[size];

To założę się że nie popełnił byś takiego błędu.

Te dwie pętle nigdy nie zadziałają, bo cały czas będziesz nadpisywał całą tablicę.

Mógłbyś zrobić coś takiego:

for(i = dlugosc - 1, j = 0; i >= 0; i--, j++)
{
    napis2[j] = napis1[i];
}

To będzie działać dopóki będziesz pewny że napis2 pomieści wszystko co jest w napis1.

Nie powinieneś również używać gets() bo jest to funkcja niebezpieczna - nie sprawdza rozmiaru bufora.
Możesz za to użyć fgets():

fgets(napis1, sizeof(char) * 10, stdin);
napis1[strcspn(napis1, "\n")] = 0;

Za pomocą strcspn() pozbywamy się znaku nowej linii.

A jeszcze lepiej jak pozbędziesz się magicznej 10 i zrobisz np.

int main(int argc, char *argv[])
{
    const int size = 10;
    char napis1[size];
    char napis2[size];

    fgets(napis1, sizeof(char) * size, stdin);

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