<br>Gracias por la ayuda Steven, voy a buscar como usar la clase string de la STL.<br><br>Muchas gracias por los consejos.<br><br>Chema<br><br><br><br><div class="gmail_quote">El 15 de mayo de 2009 20:40, Steven Davidson <span dir="ltr"><<a href="mailto:srd4121@njit.edu">srd4121@njit.edu</a>></span> escribió:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Hola Chema,<div><div></div><div class="h5"><br>
<br>
José María Nevárez wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hola amigos listeros, quisiera si me podrian decir cual es la forma<br>
más apropiada de concatenar un solo caracter a una cadena de<br>
carcteres.<br>
<br>
Ejemplo:<br>
<br>
char *Token;<br>
char c;<br>
<br>
o si por ejemplo tengo:<br>
<br>
char Token[15];<br>
char c;<br>
<br>
y quiero concatenar esos dos- Token y c.<br>
<br>
Lo que estoy haciendo es un analizador lexicográfico (SCANNER). Lo<br>
que hago es tomar una linea de un archivo de texto.<br>
Y la idea es ir separando las palabras o "tokens" (para después clasificarlos).<br>
La verdad no sé cual de los dos ejemplos me sirva más para guardar<br>
los tokens, y como acumular cada carcter leído a cada token.<br>
<br>
</blockquote>
<br></div></div>
Si aún queda espacio en 'Token', entonces puedes agregar 'c' al final. Sin embargo, si estás intentando crear una cadena de caracteres, mantener el carácter nulo al final. Por lo tanto, al agregar un carácter al final, también debes agregar el carácter nulo. Por ejemplo,<br>

<br>
int nCantidad;<br>
...<br>
Token[nCantidad] = c;<br>
Token[++nCantidad] = 0;  // Carácter nulo y actualizamos 'nCantidad'<br>
<br>
Si necesitas redimensionar la cadena para guardar más caracteres, entonces me temo que el array no te servirá, porque no se puede redimensionar. Por lo tanto, requerirás un puntero, para poder adjudicar y posiblemente readjudicar memoria dinámicamente.<br>

<br>
Te todas maneras, sugiero usar las STL y en particular la clase 'string'. Funciona como un array de caracteres, pero automáticamente se redimensiona cuando haga falta. Por ejemplo,<br>
<br>
string tokens;<br>
char c;<br>
...<br>
tokens.push_back( c );  // o incluso, tokens.append( 1, c );<br>
<br>
Acerca del analizador lexicográfico, te aconsejo que la lista de "tokens" sea una lista de códigos numéricos que representen tales "tokens". Por ejemplo,<br>
<br>
enum token_t { PAREN_IZQ, PAREN_DER, OP_ASIGNACION, OP_SUMA, OP_RESTA, OP_PRODUCTO, OP_DIVISION, OP_POTENCIA, TIPO_INT, TIPO_FLOAT, TIPO_DOUBLE, TIPO_CHAR, TIPO_BOOL };<br>
<br>
const char *lista_tokens_cadenas[14] = { "(",<br>
                                         ")",<br>
                                         "=",<br>
                                         "+",<br>
                                         "-",<br>
                                         "*",<br>
                                         "/",<br>
                                         "^",<br>
                                         "int",<br>
                                         "float",<br>
                                         "double",<br>
                                         "char",<br>
                                         "bool",<br>
                                       };<br>
<br>
Ahora puedes mantener una lista de enteros que representa los índices a cada "token" en nuestra lista de arrays. Por ejemplo,<br>
<br>
token_t lista_tokens[1024], token;<br>
...<br>
// Crear la lista de "tokens"<br>
while( ... )<br>
{<br>
  ...<br>
  // Buscar el token que corresponda a la subcadena<br>
  for( ... )<br>
    if( token = BuscarToken( szCadena, lista_tokens_cadenas[i] ) )<br>
      Agregar_Token( lista_tokens, token );<br>
}<br>
<br>
En lugar de un array de 'token_t', podríamos usar la plantilla 'vector', para no preocuparnos de redimensionar el array. Por ejemplo,<br>
<br>
vector< token_t > lista_tokens;<br>
...<br>
if( ... )<br>
  lista_tokens.push_back( token );<br>
<br>
Como existe una asociación entre el valor numérico y la cadena de caracteres, podríamos usar otra plantilla llamada 'map'. Por ejemplo,<br>
<br>
typedef pair< token_t, string > TOKEN_STR;<br>
<br>
map< token_t, string > mapa_tokens;<br>
<br>
mapa_tokens.insert( TOKEN_STR( PAREN_IZQ, "(" ) );<br>
mapa_tokens.insert( TOKEN_STR( PAREN_DER, ")" ) );<br>
mapa_tokens.insert( TOKEN_STR( OP_ASIGNACION, "=" ) );<br>
mapa_tokens.insert( TOKEN_STR( OP_SUMA, "+" ) );<br>
mapa_tokens.insert( TOKEN_STR( OP_RESTA, "-" ) );<br>
mapa_tokens.insert( TOKEN_STR( OP_PRODUCTO, "*" ) );<br>
...<br>
<br>
<br>
Espero que todo esto te ayude y te oriente.<br><font color="#888888">
<br>
Steven</font><div><div></div><div class="h5"><br>
<br>
<br>
_______________________________________________<br>
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net" target="_blank">Cconclase@listas.conclase.net</a><br>
<a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a><br>
Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a><br>
</div></div></blockquote></div><br>