Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Λοιπόν,ο παρακάτω κώδικας απευθύνεται κυρίως στο φίλο 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. :D

  • Like 1

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...