Hola en el siguiente codigo, alguien me podria explicar estas lineas
Citar#define PTO_MEDIO(s) (40 - strlen((s))/2 )
Citarprintf("%*s",PTO_MEDIO(texto) - 1," ");
No entiendo en la primera por que es 40 - ... si para el punto medio se supone que deberia ser una suma,
en la segunda no entiendo por que se le resta 1 al resultado :l
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ANCHO_MAX 80
#define PTO_MEDIO(s) (40 - strlen((s))/2 )
int main(int argc,char* argv[])
{
char texto[79]; /*78 caracteres + '\0'*/
int i,j;
do{
printf("Introduce un texto: ");
fflush(stdin);
fgets(texto,79,stdin);
if(strlen(texto)==78)
{
if(texto[77]=='\n')
texto[77]='\0';
}
else
texto[strlen(texto)-1]='\0';
}while(strlen(texto)==0);
printf("\n");
/*
Ponemos 5 filas y strlen(texto) + 2 columnas
Esto se puede cambiar introduciendo variables para crear un tabla con otras dimensiones
*/
for(i=0;i<5;i++)
{
if(strlen(texto)<77)
printf("%*s",PTO_MEDIO(texto) - 1," ");
if(i==0 || i==4)
for(j=0;j< strlen(texto) + 2;j++)
printf("*");
else if(i==2)
{
printf("*%s*",texto);
}
else
{
printf("*%*s*",strlen(texto)," ");
}
if(strlen(texto)<78)
printf("\n");
/*else se llega al final de la linea y automaticamente el cursor pasa a estar en la
primera posicion de la siguiente linea*/
}
printf("\n");
system("PAUSE");
return 0;
}
No estoy muy seguro pero el punto medio es debido a que como su máximo es 80, ya que 80 es el limite de la pantalla, si se pasa pues el cursor situaría los asteriscos desordenamente, y con lo del menos uno debe ser por el \0 que en una cadena de caracteres significa el final y por lo obvio debes reservar su espacio si o si porque si no ocurriría lo que te dije anteriormente, se desordenaría en caso de que fueran más de 80 caracteres, el 80 es para el \0. Y además el punto medio no es una suma, se supone que el punto medio es un numero situado en la mitad de algo, si digo 80, su punto medio sería 40, y lo de la operación, es para partir de ahí y que se expanda hacía los lados. No se si me equivoque pero si lo hice por favor corrijanme.