Zliczanie znaków w tablicy

0

chce sobie zliczyć znaki bez użycia funkcji strlen();
napisałem coś takiego tylko że wyświetlą błąd w tej pętli

char tab1[N]="C:\\Users\\bigos\\Pictures\\Bleach\\Movie.mp4";
int a;
for(i=0; tab1[i]!=NULL; i++)
		a++;

[Warning] NULL used in arithmetic [-Wpointer-arith]

0
for(i=0; tab1[i]!='\0'; i++)

Dodatkowo zmiennej a nie potrzebujesz. Wystarczy odczytać wartość zmiennej i.

0

przecież \0 pznacza NULL więc czemu tak działa a z NULL nie

0

Nie do konca to zalezy od tego jak kompilator interpretuje nulla. Znak \0 jest znakiem konca ciagu, a NULL nie musi byc tym samym dla pewnych kompilatorow.

Nawet prosciej by bylo

while(tab[length]!='\0')length++;
0

NULL to wskaźnik. Nie możesz porównywać znaku ze wskaźnikiem.

0

Bo jej nie wyzerowałes.

0
jeszcze jedna sprawa dotycząca tego NULL

#include <stdio.h>
#include <stdlib.h>
#define N 1000

int main(void)
{
	char tab1[N]="C:\\Users\\Bigos\\Pictures\\Bleach\\Movie IV.mp4";
	char tab2[N];
	int i, a=0;
	
	printf("%s\n", tab1);
	
	for(i=0; tab1[i]!='\0'; i++)
		a++;
	
	for(; tab1[i]!='\\'; i--)
		a--;
	a+=1;
				
	for(i=0; tab1[a]!='\0'; i++)
	{
		tab2[i]=tab1[a];
		a++;
	}
	tab2[i]=NULL; /* dlaczego tu jest ok ??*/
	
	printf("%s\n", tab2);
	
	system("pause");
	return 0;	
}

I przy okazji czy tego nula muszę dodać sam czy mogę go też skopiować z tamtej tablicy.

0
lukasz1235 napisał(a):

NULL to wskaźnik. Nie możesz porównywać znaku ze wskaźnikiem.

Nie do konca. http://www.cplusplus.com/reference/clibrary/cstring/NULL/

To wszystko jest zalezne od kompilatora jak mowilem. U mnie niewazne czy porownam z '\0' czy z NULL kompiluje sie i dziala poprawnie. Ogolnie w c++(c nie wiem) dla porownania ze strignami NULL jest traktowany jako wlasnei znak 0.

0

NULL jest często w C definiowany jako 0 i jest gwarantowane, że 0 będzie działało jako wskaźnik pusty. W C++ (03) NULL musi być 0 (intem), w C może być chyba też (void *) 0. To makro jest zdefiniowane w celu oznaczania pustego wskaźnika, czyli wskaźnika który nie wskazuje na nic i używanie tego w jakimkolwiek innym celu, nawet jak się to kompiluje, jest błędem. Ciąg znaków kończy się znakiem zero ('\0' lub (char)0), a nie pustym wskaźnikiem. Nawet jak ze względu na automatyczne skracanie typów możesz przypisać, czy porównywać znaki z NULLem, to i tak się tego nie robi. Wprowadzasz zamieszanie dla innych programistów i prowokujesz tak błędy. Dodatkowo jak kompilator inaczej zdefiniuje NULLa, to Ci się taki kod nie skompiluje, bo jest błędny! Może tak zrobić i standardowy kompilator C, i kompilator C++11 (definiując NULLa jako nullptr).

BTW W VS chcieli domyślnie zdefiniować NULLa jako nullptr, ale okazało się, że dużo kodu się psuło przez używanie NULLa tam gdzie się tego nie powinno robić (tzn. wszędzie indziej, niż przy przypisywaniu do wskaźników).

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