gon1332 Δημοσ. 1 Ιουλίου 2015 Δημοσ. 1 Ιουλίου 2015 Λοιπόν,ο παρακάτω κώδικας απευθύνεται κυρίως στο φίλο gon1332 που ξέρω πως τα γουστάρει κάτι τέτοια, αλλά φυσικά και σε όποιον άλλον διαβάσει το νήμα και το βρει ενδιαφέρον: Κώδικας: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdarg.h> /* Print specified msg (a-la printf) along with debugging information. */ #define DBGF( format, ... ) \ do { \ int c_; \ puts("*** RUNTIME ERROR CAUGHT ****"); \ fprintf(stderr, "*** File: %s | Line: %d | Func: %s()\n", \ __FILE__, __LINE__, __func__); \ fprintf(stderr, "%s", "*** "); \ fprintf(stderr, (const char *)(format), __VA_ARGS__); \ // fflush(stderr); \ putchar( '\n' ); \ } while(0) /* -------------------------------------------------------------- * char *vprintf_to_text(): * * This function is a wrapper to ISO C99's vsnprintf(). It creates * dynamically the buffer needed to hold the printed output, and if * it succeeds it returns a pointer to it. On error, it returns NULL. * * NOTES: * 1. vargs MUST have been already initialized in the caller * (by the va_start macro, and possibly subsequent va_arg * calls). * 2. The returned buffer, if non-NULL, MUST be freed in the * calling environment. * 3. The function is used in the function: printf_to_text() * -------------------------------------------------------------- */ char *vprintf_to_text( const char *fmt, va_list vargs ) { int nchars = 0; char *buf = NULL; size_t bufsz = BUFSIZ; /* make buf to hold the text and pass it to vsnprintf */ if ( NULL == (buf = calloc(1, bufsz)) ) { DBGF( "%s", "calloc failed!" ); goto ret_failure; } nchars = vsnprintf( buf, bufsz, fmt, vargs ); if ( nchars < 0 ) { DBGF( "%s", "vsnprintf failed!" ); goto ret_failure; } /* Was buf too small to hold the text? * Reallocate 1+nchars bytes and re-apply. */ if ( nchars >= (int)bufsz ) { char *try = NULL; bufsz = 1 + nchars; /* for the NUL byte */ try = realloc( buf, bufsz ); if ( NULL == try ) { DBGF( "%s", "realloc failed!" ); goto ret_failure; } buf = try; nchars = vsnprintf( buf, bufsz, fmt, vargs ); if ( nchars < 0 ) { DBGF( "%s", "vsnprintf failed!" ); goto ret_failure; } } return buf; ret_failure: if ( buf ) { free( buf ); } return NULL; } /* -------------------------------------------------------------- * char *printf_to_text(): * * This function is similar to ISO C99's snprintf() but it creates * dynamically the string needed to hold the print-out. It returns * the string, or NULL on error. * -------------------------------------------------------------- */ char *printf_to_text( const char *fmt, ... ) { char *txtout = NULL; if ( NULL == fmt ) { DBGF( "%s", "NULL pointer argument (fmt)" ); return NULL; } va_list vargs; va_start( vargs, fmt ); txtout = vprintf_to_text( fmt, vargs ); va_end( vargs ); return txtout; } /****************************************************//** * ******************************************************** */ char *ullong_to_string( unsigned long long int num, size_t *digcount ) { char *ret = printf_to_text( "%llu", num ); if ( NULL == ret ) { DBGF( "%s", "printf_to_text() failed" ); if ( NULL != digcount ) { *digcount = 0; } return NULL; } if ( NULL != digcount ) { *digcount = strlen( ret ); } return ret; } /****************************************************//** * ******************************************************** */ int main( void ) { size_t n = 0; char *s = ullong_to_string( 1254879786879834, &n ); printf( "%s (%d digits)\n", s, n ); free( s ); return 0; } Όλα τα λεφτά είναι η συνάρτηση: vprintf_to_text() και αμέσως μετά η printf_to_text() που την χρησιμοποιεί. Ο κώδικας είναι C99, και ουσιαστικά είναι copy & paste από τον κώδικα του 2048cc για όποιον το θυμάται (και πιο συγκεκριμένα από το πηγαίο: common.c). Χαχαχα. Αυτό ήταν λίγο overkill. 1
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα