Wątek przeniesiony 2017-11-29 12:55 z C/C++ przez kq.

Długość ciągu znaków w tablicy vs. sizeof

0

Dzień dobry.
Czy jest jakaś opcja żeby usunąć z tablicy puste znaki?

A teraz dokładniej. Zadeklarowałem tablicę na maksymalnie 50 elementów. Proszę użytkownika o podanie zdania do rozszyfrowania. Następnie przepisuję to zdanie do nowej tablicy (również o rozmiarze 50) jednak usuwając powtarzające się spacje i puste znaki. A następnie w pętli używam funkcji sizeof(), jednak zwraca ona rozmiar 50, a nie rzeczywisty. W jaki sposób mogę zawęzić rozmiar do obecnego, a nie deklarowanego?

#include <stdio.h>

int main()
{
	char tab[50];
	char tabb[50];
	int i,g;
	int size = sizeof(tab);
	char *znak = tab;
	printf("Podaj tekst: ");
	getline(&znak,&size,stdin);
	for(i=0;i<sizeof(tab);i++)
	{
		if((tab[i]==' ' && tab[i-1]==' ') || tab[i]==0)
			{}
		else
		{
			tabb[i]=tab[i];
			printf("%c",tabb[i]);
		}
	}

	for(g=1;g<=26;g++)
	{
		for(i=0;i<=10;i++)
		{
			if(tab[i]!=' ')
			{
				if(tab[i]+g<'a')
					tabb[i]='z'-tab[i]-g+'a'+1;
				if(tab[i]+g>='a' && tab[i]+g<='z')
					tabb[i]=tab[i]+g;
				if(tab[i]+g>'z')
					tabb[i]='a'+tab[i]+g-'z'-1;
			}
			printf("%c",tabb[i]);
		}
		printf("\n");
	}

}

0

Załóżmy przykładowo, że masz tablicę 50 elementów i usunąłeś 3 elementy.

Teraz w pamięci masz:

Jakieś dane....
50 bajtów zajęte
Jakieś dane..

Po edycji masz
Jakieś dane...
47 bajtów
3 bajty wolne
Jakieś dane...

I co teraz ten system miałby zrobić z tymi 3 bajtami?

Więc zwalniasz ten blok pamięci i bierzesz nowy, przepisując stary usuwając równocześnie niepotrzebne elementy.

1

sizeof zwraca wielkość obiektu. Tobie zależy na długości ciągu znaków, użyj strlen

0

Faktycznie. Dziękuję, działa.

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