sprintf () z automatycznym przydzielaniem pamięci?
Szukam sprintf () - podobnej implementacji funkcji, która automatycznie przydziela niezbędną pamięć. Więc co chcę powiedzieć
char* my_str = dynamic_sprintf( "Hello %s, this is a %.*s nice d string", a, b, c, d );
a my_str pobiera adres przydzielonej pamięci, która zawiera wynik tego sprintf ().
Na innym forum przeczytałem, że można to rozwiązać w ten sposób:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>int main()
{
char* ret;
char* a = "Hello";
char* b = "World";
int c = 123; int numbytes; numbytes = sprintf( (char*)NULL, "%s %d %s!", a, c, b );
printf( "numbytes = %d", numbytes ); ret = (char*)malloc( ( numbytes + 1 ) * sizeof( char ) );
sprintf( ret, "%s %d %s!", a, c, b ); printf( "ret = >%s<\n", ret );
free( ret ); return 0;
}
Ale to natychmiast prowadzi do segfaulta, gdy wywoływana jest sprintf () ze wskaźnikiem NULL.
Masz więc pomysły, rozwiązania lub wskazówki? Wystarczyłaby mała implementacja parsera sprintf (), która jest publicznie dostępna, wtedy mógłbym to zrobić sam.
Wielkie dzięki!
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
7 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
z przepełnienia stosu
https://coderoad.ru/1775403/... Jak wspominali inni, potrzebujesz , a nie . Upewnij się, że drugi argument dla to . Zapobiegnie to zapisywaniu w ciągu , który jest pierwszym argumentem.
Drugi argument jest potrzebny, ponieważ informuje , że nie ma wystarczającej ilości miejsca na zapis do bufora wyjściowego. Jeśli nie ma wystarczającej ilości miejsca, zwraca liczbę bajtów, które zostałyby zapisane, gdyby było wystarczająco dużo miejsca.
Odtwarzam tutaj kod z tego linku ...
Anonimowy użytkownik
Potwierdzenie od:
asprintf
http://linux.die.net/man/3/asprintf
i vasprintf, które są do tego przeznaczone. Dowie się, jak przydzielić Ci pamięć i zwróci wartość null przy każdym błędzie alokacji pamięci.
asprintf postępuje właściwie w odniesieniu do alokacji linii - najpierw mierzy rozmiar, a następnie próbuje przydzielić za pomocą malloc. W przeciwnym razie zwraca null. Jeśli nie masz własnego alokatora pamięci, który eliminuje użycie malloc, asprintf jest najlepszym narzędziem do tego zadania.
Kod będzie wyglądał następująco:
Anonimowy użytkownik
Potwierdzenie od:
Ale i są zalecane przez POSIX zgodnie ze stroną podręcznika, a ta ostatnia może być użyta do stworzenia własnej prostej wersji i . [/code]
Możesz użyć magicznych preprocesorów i używać swoich wersji funkcji tylko w systemach, które ich nie obsługują.
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
który robi dokładnie to, co chcesz, jeśli linkowanie do GLib jest opcją. Z dokumentacji:
Podobna do standardowej funkcji C , ale od niej bezpieczniejsza
oblicza maksymalną wymaganą przestrzeń
i przydziela pamięć do przechowywania
wynik. Zwrócony ciąg powinien być
zwolniony przez , gdy już nie ma
niezbędny.
Anonimowy użytkownik
Potwierdzenie od:
open_memstream (3) jest dostępny przynajmniej na Linuksie i MacOS i istnieje od kilku lat. Odwrotnością open_memstream (3) jest fmemopen (3), dzięki czemu zawartość bufora jest czytelna.
Jeśli potrzebujesz tylko jednego sprintf (3), to szeroko stosowany, ale niestandardowy asprintf (3) może być dokładnie tym, czego potrzebujesz.
Anonimowy użytkownik
Potwierdzenie od: