Un sencillo editor de texto
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>
#define LIN 100 /* lineas de texto */
#define LONG 255 /* caracteres por linea */
#define MAX 4
/* prototipos */
char menu( void );
int readText( char s[][LONG + 1] );
void printText( const char s[][LONG + 1], const int t );
void printLine( const char s[][LONG + 1], const int t );
/* la función main() comienza la ejecución del programa */
int main()
{
char texto[LIN][LONG + 1] = { "" }; /* iniciar todas las cadenas a nulo */
int t;
char opcion;
/* ciclo de control del programa */
while ( (opcion = menu()) != 'S' ) {
switch( opcion ) {
case 'N':
t = readText( texto );
break;
case 'M':
printText( texto, t );
break;
case 'F':
printLine( texto, t );
break;
default:
printf( "
Opcion no valida
" );
break;
}
printf( "
Pulse una tecla para volver al menu principal " );
getch(); /* pausa */
}
return 0; /* indica terminación exitosa */
} /* fin de main() */
/* devuelve la opción elegida por el usuario */
char menu( void )
{
char c;
clrscr();
printf( "
" );
printf( " N. Nuevo texto
"
" M. Mostrar texto
"
" F. Mostrar un fila
"
" S. Salir
" );
printf( " Opcion: " );
c = (char)toupper(getch());
clrscr();
return c;
}
/* lee el texto y devuelve el número de lineas ingresadas */
int readText( char s[][LONG + 1] )
{
register int t;
printf( "
Ingrese su texto (una linea en blanco para terminar):
" );
/* iniciar la primera cadena a nulo */
s[0][0] = ' '; // *s[0] = ' '
for ( t = 0; t < LIN; ++t ) {
printf( "%3d: ", t );
gets( &s[t][0] ); // gets( s[t] )
/* salir en caso de linea en blanco */
if ( !s[t][0] ) // !*s[t]
break;
}
return t;
}
/* imprime el texto caracter a caracter */
void printText( const char s[][LONG + 1], const int t )
{
register int i, j;
/* si la primera cadena del texto es nula */
if ( !s[0][0] ) // !*s[0] */
printf( "
Texto vacio
" );
else {
printf( "
Su texto es:
===========
" );
for ( i = 0; i < t; ++i ) {
printf( "%3d: ", i );
for ( j = 0; s[i][j]; ++j )
printf( "%c", s[i][j] );
printf( "
" );
}
}
}
/* imprime una linea de texto especificada por el usuario */
void printLine( const char s[][LONG + 1], const int t )
{
char *p;
int fila;
long int obtFila( const int t ); /* prototipo */
printText( s, t );
/* si la primera cadena del texto no es nula */
if ( s[0][0] ) { // *texto[0] */
printf( "
" );
fila = obtFila( t );
/* hacer que 'p' apunte a la fila deseada */
p = (char *)s[fila];
printf( "
Fila %3d -> %s
", fila, p );
}
}
/* devuelve el número de fila ingresada por el usuario */
long int obtFila( const int t )
{
char cadNum[MAX + 1];
int numero;
int err = 1; /* indicador de error */
char *obtNatural( char *s, const int max ); /* prototipo */
/* ciclo para controlar error en la entrada */
do {
printf( " Que fila desea mostrar: " );
obtNatural( cadNum, MAX );
numero = atoi( cadNum );
if ( !cadNum[0] ) // !*cadNum
printf( " Cadena vacia
" );
else if ( numero >= t )
printf( " Fila fuera de rango
" );
else
err = 0;
} while( err ); /* fin do...while */
return numero;
}
/* devuelve un puntero a la cadena "s" que contiene un N(Natural) */
char *obtNatural( char *s, const int max )
{
register char c;
int i = 0;
char *strcatchr( char *cad, char c, int *t ); /* prototipo */
/* iniciar la cadena a nulo */
s[0] = ' '; // *s = ' ';
while ( (c = (char)getch() ) != '
' ) {
/* si pulsa Backspace y se han contabilizado caracteres */
if ( c == '' && i > 0 ) {
putchar( '' );
putchar( ' ' );
putchar( '' );
i--;
s[i] = ' ';
}
else {
if ( i < max ) {
if ( c >= '0' && c <= '9' ) {
putchar( c );
strcatchr(s, c, &i);
}
}
}
}
putchar( '
' );
return s;
}
/* concatena el caracter 'c' a la cadena apuntada por "cad" */
char *strcatchr( char *cad, char c, int *t )
{
cad[*t] = c;
*t = *t + 1;
cad[*t] = ' ';
return cad;
}