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

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

Δημοσ.

Καλησπέρα,

 

Μπορώ να κεντράρω το κείμενο εξόδου της printf; Αν ναι πως; 

Θέλω να δημιουργήσω ένα δέντρο από αστεράκια της μορφής αυτής:

   *

  ***

 *****

*******

 

Thanks in advance!!

Δημοσ.

Όχι η printf δεν έχει δυνατότητες μορφοποίησης. Κάνεις την δουλειά σου έμμεσα όμως:

void f(char *s)
{
printf("---%*s%*s---\n",10+strlen(s)/2,s,10-strlen(s)/2,"");
}
int main(int argc, char **argv)
{
f("*");
f("**");
f("***");
f("****");
return 0;
}
Δημοσ.

Καλησπέρα,

 

Μπορώ να κεντράρω το κείμενο εξόδου της printf; Αν ναι πως; 

Θέλω να δημιουργήσω ένα δέντρο από αστεράκια της μορφής αυτής:

   *

  ***

 *****

*******

 

Thanks in advance!!

 

Aσκηση ειναι αυτο? Γινεται ευκολα με for-loops αρκει να σκεφτείς καλα τι θες να κάνεις πρωτα. Δουλεψε το στο χαρτι αρχικα.

 

Όχι η printf δεν έχει δυνατότητες μορφοποίησης. Κάνεις την δουλειά σου έμμεσα όμως:

void f(char *s)
{
printf("---%*s%*s---\n",10+strlen(s)/2,s,10-strlen(s)/2,"");
}
int main(int argc, char **argv)
{
f("*");
f("**");
f("***");
f("****");
return 0;
}

 

Δεν ζηταει κάτι τετοιο η άσκηση του. Θέλει ουσιαστικα να κατασκευάσεις ένα δέντρο ύψους n αστερισκων και πλάτους 2n-1. 

Δημοσ.

Όχι η printf δεν έχει δυνατότητες μορφοποίησης. Κάνεις την δουλειά σου έμμεσα όμως:

 

 

void f(char *s)
{
printf("---%*s%*s---\n",10+strlen(s)/2,s,10-strlen(s)/2,"");
}
int main(int argc, char **argv)
{
f("*");
f("**");
f("***");
f("****");
return 0;
}

 

 

Ίσα-ίσα, που το f της printf σημαίνει formatted, δηλαδή όλο μαζί: μορφοποιημένη έξοδος. Απλώς αναφέρεται σε text mode, συν ότι είναι και περιορισμένων δυνατοτήτων η μορφοποίηση που κάνει σε ότι αφορά κεντραρίσματα, κλπ (το f αναφέρεται περισσότερο στο ότι εκτυπώνεις μορφοποιημένα τα νούμερα).

 

Πάντως ο αστερίσκος που βάζεις, μορφοποίηση στοίχισης είναι και αναφέρεται στο μέγιστο πλήθος χαρακτήρων που θα καταλάβει αυτό που τυπώνεις, το οποίο αν έχει λιγότερους χαρακτήρες στοιχίζεται δεξιά. Μπορείς να το στοιχίσεις και αριστερά, βάζοντας αρνητική τιμή.

 

Αν θέλουμε να κεντράρουμε ένα string s στη γραμμή του, μπορούμε να γράψουμε κάτι σαν το παρακάτω...

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SCRN_MAXCOLS	80

void s_put_centered( const char *s )
{
	size_t slen = 0;

	if ( !s || !*s )
		return;

	slen = strlen(s);
	printf( "%*s\n", SCRN_MAXCOLS/2 + slen/2, s );
}

int main( void )
{
	s_put_centered( "i am centered" );
	getchar();

	return 0;
}
Δημοσ.

ναι, με έμμεσο τρόπο βάζοντας κενά το έκανα, απλά ήθελα να δω αν υπήρχε πιο εύκολη λύση (centered printf εντολή ξερω 'γω). thanks :D

Στη δική μου απάντηση χτες σου έγραψα custom συνάρτηση τύπου: puts_centered(s) που δεν χρησιμοποιεί hardcoded κανένα κενό...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SCRN_MAXCOLS	80
#define TREE_MAXROWS	4

void s_put_centered( const char *s )
{
	if ( !s || !*s )
		return;
	printf( "%*s\n", SCRN_MAXCOLS/2 + strlen(s)/2, s );
}

int main( void )
{
	char s[2*TREE_MAXROWS + 1] = {'\0'};
	for (int i=0; i < TREE_MAXROWS; i++)
	{
		for (int j=0; j < 2*i+1; j++)
			s[j] = '*';
		s_put_centered(s);
	}

	getchar();
	return 0;
}
/*
  ΕΞΟΔΟΣ:

                                       *
                                      ***
                                     *****
                                    *******
 */
Για custom συνάρτηση του στυλ printf_centered( const char *format, arguments-list ) είναι αρκετά πιο περίπλοκο, διότι πρέπει να χρησιμοποιήσεις variable arguments function, ιδανικά συνδυασμένη με την vsprintf() στο σώμα της (ή ακόμα καλύτερα την vsnprintf() όπου υποστηρίζεται), ώστε να πάρεις την έξοδό της σε μορφή string και να το τυπώσεις κατόπιν κεντραρισμένο με την s_put_center() που σου έδωσα παραπάνω...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>

#define SCRN_MAXCOLS	80
#define MAX_BUFSIZE	(255+1)

void s_put_centered( const char *s )
{
	if ( !s || !*s )
		return;
	printf( "%*s\n", SCRN_MAXCOLS/2 + strlen(s)/2, s );
}

int printf_centered( const char *format, ... )
{
	va_list valist;
	char buffer[MAX_BUFSIZE] = {'\0'};
	int ret = -1;

	if ( !format || !*format )
		return ret;	// -1

	va_start( valist, format );
	ret = vsnprintf( buffer, MAX_BUFSIZE, format, valist );
	va_end( valist );
	if ( ret > 0 )
		s_put_centered( buffer );

	return ret;
}

int main( void )
{
	printf_centered( "%g %d", 2.3, 12 );
	getchar();
	return 0;
}
/*
 ΕΞΟΔΟΣ:
                                     2.3 12
 */

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

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

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

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

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

Σύνδεση

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

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