Stringi w c / strlen()

0

Siemka,
Dlaczego dla n = np 999;
Poniższa funkcja:

 char * intToString(int n){
	char buf[20];
	int i = 0;
	while( n ){
		buf[i] = char((n % 10) + 48);
		n /= 10;
		i++;
	}
	buf[i] = '\0';
	//zwraca odwrocona liczbe ale to nie ma znaczenia
	return buf;
}

W tym przypadku

 int n;
	scanf( "%d", &n);
	printf("%d\n", strlen(intToString(n)) ); 

Zwraca 3, a w tym przypadku:

void notworking(char * s){	
	printf("dlugosc -> %d", strlen(s));
}

Zwraca mi 31 albo 21 :S

Nie bardzo wiem dlaczego, anyone?

0

jescze zapomnialem dodac :

 
int n;
scanf("%d", &n );
notworking( intToString ( n) );
0

jescze zapomnialem dodac :

 
int n;
scanf("%d", &n );
notworking( intToString ( n) );
0

Nie możesz zwracać tablic zaalokowanych na stosie. Utwórz tablicę dynamiczną za pomocą malloc i zwolnij ją później, po wywołaniu funkcji.

0

Wybacz ignorancję, ale kiedy dokładnie alokuje mi na stosie? Bo w pierwszym przypadku dziala :S

0
char buf[20];

To alokuje tablicę na stosie.

0

W takim razie to

Nie możesz zwracać tablic zaalokowanych na stosie.
jest nieprawda, bo sobie zwracam i jest cacy wynik. A potem dobpiero jak przekazuje to do innej funkcji jest problem :S

0

Przeczytaj sobie dokładnie tą odpowiedź: http://stackoverflow.com/a/6445794

0
noobek1133 napisał(a):

W takim razie to

Nie możesz zwracać tablic zaalokowanych na stosie.
jest nieprawda, bo sobie zwracam i jest cacy wynik. A potem dobpiero jak przekazuje to do innej funkcji jest problem :S
Znalazło się jajko mądrzejsze od kury.

Są 3 sposoby poprawienia tego:
#głupi, ale szybki:

    static char buf[20]; //zmienna globalna widoczna tylko w tym pliku źródłowym
    char * intToString(int n){
        int i = 0;
        while( n ){
                buf[i] = char((n % 10) + 48);
                n /= 10;
                i++;
        }
        buf[i] = '\0';
        //zwraca odwrocona liczbe ale to nie ma znaczenia
        return buf;
}

#prawidłowy bez alokowania pamięci:

void intToString(int n, char *buf){
        int i = 0;
        while( n ){
                buf[i] = char((n % 10) + 48);
                n /= 10;
                i++;
        }
        buf[i] = '\0';
        //zwraca odwrocona liczbe ale to nie ma znaczenia
        return buf;
}

int n;
scanf("%d", &n );
char buf[30];
intToString(n, buf);
printf("tada: %s !", buf);

#z alokowaniem pamieci

0

Jest jeszcze 4-ty sposób:

    char * intToString(int n){
        static char buf[20]; // zmienna lokalna statyczna
        int i = 0;
        if(!n) buf[i++]='0'; // jeżeli liczba już jest zerem
        else while( n ){
                int  d=n/10;
                buf[i]=char((n-10*d) +'0'); // wbrew pozorom to będzie szybsze
                n=d;
                ++i;
        }
        buf[i--] = '\0';
        for(int k=0;k<i;++k,--i) { char x=buf[k]; buf[k]=buf[i]; buf[i]=x; } // odwraca liczbę
        return buf;
}

Z tym że nie będzie działać dobrze w trybie wielowątkowym.

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