[Ayuda] separar cadena en partes

Iniciado por sabeeee, 8 Enero 2015, 03:49 AM

0 Miembros y 1 Visitante están viendo este tema.

sabeeee

Bueno, les explico soy muy pero muy novato en C  :-[ y me puse a "mejorar", un poco un código de batch a C, que en realidad solo llama al system, y la verdad es que ahora quiero que traduzca muy básico por ejemplo tengo en batch:

set pepe=hola
echo %pepe%


que en c seria algo asi

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

int main()
{
char pepe[21] = hola;
printf(pepe);
return 0;
}


O
echo HOLA MUNDO

que en c seria algo asi

#include <stdio.h>

int main()
{
printf("HOLA MUNDO");
return 0;
}


intente con memcpy y no entiendo muy bien solo necesitaría separar por ejemplo set "variable" = "valor", si sale vamos por linux.

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

#ifdef __cplusplus__
 #include <cstdlib>
#else
 #include <stdlib.h>
#endif

// Limpiador de pantalla
void clrScr()
{
if (system("CLS")) system("clear");
}

// Mensaje "propagandistico"
void Mensaje()
{
printf("\t+----------------------------+\n");
   printf("\t|BATCH TO C SOURCE CONVERTER |\n");
   printf("\t+----------------------------+\n");
}
// Limpiador de ENTER
void EnterLimp()
{
while ( getchar() != '\n' );    /* limpia el caracter ENTER de la entrada estandar */
}

int main()
{
int oculto;
int clave;
int concatenado;

   FILE *fp;
char *cPtr;
   char filename[30];          //filename for source code
   //end part of output file
   char end[50] = "\treturn 0;\n}";
   //for command
   char cmd[150];
   //la clave
   char cmb[350];

// Nombre archivo final
Mensaje();
printf("\nEntre el nombre que le quiere dar al codigo saliente(.c): ");
scanf("%s",filename);
EnterLimp();

clrScr();

// Tipo de clave
Mensaje();
printf("AVISO: (No es posible modo oculto con clave externa) (2) \n ");
printf("Para modo clave escriba 1 o 2 para clave externa (-pass clave) : ");
scanf("%d" ,&clave);
EnterLimp();
clrScr();

// Modo clave 1
if( clave== 1 ){
Mensaje();
   printf("\nLa clave de mas de 3 caracteres: ");
   scanf("%s",cmb);
EnterLimp();
}
// Modo clave 2
if( clave== 2 ){
Mensaje();
   printf("\nLa clave: ");
   scanf("%s",cmb);
EnterLimp();
}
clrScr();

//Modo "oculto"
if( clave== 2 ){
Mensaje();
printf("No es posible modo oculto con clave externa\n");
printf("Enter para continuar\n");
getchar(); //pausa multiplataforma <3
}else{
Mensaje();
printf("Para modo oculto escriba 1 (solo windows) o 0 para normal : ");
scanf("%d" ,&oculto);
EnterLimp();
}
clrScr();

//Concatenado
Mensaje();
   printf("\nMetodo de concatenado : ");
   printf("\n1 para metodo modo inteligente (beta) : ");
   scanf("%d",&concatenado);
EnterLimp();

clrScr();

//Codigos
fp = fopen(filename,"w");
   if (fp==NULL)
   {
    printf("Ocurrio un error al intentar abrir el archivo");
    getchar();
    exit(1);
   }
   else
   {
// includes normales
fprintf(fp,"#include <stdio.h>\n");
       fprintf(fp,"#include <stdlib.h>\n");
if( clave== 2 ){
fprintf(fp,"#include <string.h>\n");
}
if( oculto== 1 ){
// modo oculto
       fprintf(fp,"#include <windows.h>\n");
}

if( oculto== 1 ){
       fprintf(fp,"int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,\n");
       fprintf(fp,"PSTR szCmdLine, int iCmdShow)\n");
}
// int argc, char **argv
fprintf(fp,"int main( int argc, char **argv)\n");
       fprintf(fp,"{\n");


/* A solucionar...
if( clave== 2 ){
// int argc, char **argv
fprintf(fp,"int main( int argc, char **argv)\n");
       fprintf(fp,"{\n");
}else{
// normal
       fprintf(fp,"int main()\n");
       fprintf(fp,"{\n");
} */

if( clave== 1 ){
// modo clave

       fprintf(fp,"\nchar clave[6];\n");
       fprintf(fp,"printf(\"Escriba su clave: \");\n");
       fprintf(fp,"scanf(\"%%s\",clave);\n");
       fprintf(fp,"if(strcmp(clave,\"%s\")==0)\n",cmb);
       fprintf(fp,"{\n");
}
if( clave== 2 ){
// modo consola
       fprintf(fp,"\tchar clave[21];\n");
       fprintf(fp,"\tchar clave2[21] = \"%s\";\n",cmb);
       fprintf(fp,"\tif ( argc < 3 ) {\n");
       fprintf(fp,"\tprintf(\"USO: programa -pass clave\");\n");
       fprintf(fp,"\treturn 1;\n");
       fprintf(fp,"}\n");
       fprintf(fp,"\tif ( !strcmp( argv[1], \"-pass\" ) ) {\n");
       fprintf(fp,"\tstrncpy( clave, argv[2], 20 );\n");
       fprintf(fp,"\tclave[21] = '\\0';\n");
       fprintf(fp,"}\n");
       fprintf(fp,"\telse\n");
       fprintf(fp,"return 1;\n");
       fprintf(fp,"\n");
       fprintf(fp,"\tif ( !strcmp(clave, clave2) )\n");
       fprintf(fp,"{\n");
}
clrScr();

if( concatenado== 1 ){
// concatenado
fprintf(fp,"\tchar shin[1000];\n");
fprintf(fp,"\tstrcpy (shin,\"\");\n");

Mensaje();

       printf("\nComience a escribir los comandos : \n");
       printf("Cuando finalice, ecriba 'end' para terminar\n");

       printf("\nComandos :\n\n");
       
fgets( cmd, 150, stdin );
if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';

while ( strcmp( cmd, "end" ) )
{
        fprintf(fp,"\tstrcat (shin,\"%s && \");\n",cmd);
        fgets( cmd, 150, stdin );
        if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';
}
       fprintf(fp,"\tstrcat (shin,\"exit\");\n");
fprintf(fp,"\tsystem(shin);\n");
fprintf(fp,"\tprintf(\"\\n\");\n");
}else{

//Normal
Mensaje();

       printf("\nComience a escribir los comandos : \n");
       printf("Cuando finalice, ecriba 'end' para terminar\n");

       printf("\nComandos :\n\n");
       
fgets( cmd, 150, stdin );
if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';

while ( strcmp( cmd, "end" ) )
{
        fprintf(fp,"\tsystem(\"%s\");\n",cmd);
        fgets( cmd, 150, stdin );

        if ( ( cPtr = strchr( cmd, '\n' ) ) != NULL ) *cPtr = '\0';
}
fprintf(fp,"\tprintf(\"\\n\");\n");
}

if( clave== 1 ){
// modo clave
       fprintf(fp,"\t}\nelse\n{\n");
       fprintf(fp,"\tprintf(\"Clave no valida\");\n}\n");
}

if( clave== 2 ){
// modo clave
       fprintf(fp,"\t}\nelse\n{\n");
       fprintf(fp,"\tprintf(\"Clave no valida\");\n}\n");
}

       fprintf(fp,"\n%s",end);

clrScr();


   fclose(fp);
   }
}
"Vengándose, uno iguala a su enemigo; perdonando, uno se muestra superior a él."
Francis Bacon

crack81

y que es lo que precisamente quires hacer, explicate un poco mejor saludos... :huh:
Si C/C++ es el padre de los lenguajes entonces ASM es dios.

sabeeee

#2
Cita de: crack81 en  8 Enero 2015, 05:21 AM
y que es lo que precisamente quires hacer, explicate un poco mejor saludos... :huh:

Un traductor de batch a C multiplataforma, aplicandolo a mi codigo, por ejemplo si en la consola pongo echo 123 quiero transformar eso en  printf("123");, o mas complejo, si tengo set a=b el a y el b se guarden en una variable y cuando vaya a hacer fprint se cree un char a[]=b;

o si tengo pause en vez de hacer system("pause")

detecte el pause e imprima
printf("Enter para continuar\n");
getchar();


por ejemplo.

y otra cosa muy buena que encontré es el strlen para contar la longitud de una cadena, quizá se pueda aplicar para quizás se pueda aplicar en el código también.

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

int main ()
{
  char str[80];
  strcpy (str,"Hola");
  strcat (str,"esto");
  strcat (str,"es");
  strcat (str,"un ejemplo.");
  printf ("el codigo tiene %u caracteres de largo.\n",(unsigned)strlen(str));
  return 0;
}


por ahora solo necesitaría que me expliquen bien eso de las cadenas, me ayudaría mucho.
"Vengándose, uno iguala a su enemigo; perdonando, uno se muestra superior a él."
Francis Bacon

Yoel Alejandro

Hola sabee

Las cadenas en C son arrays, es decir, arreglos, vectores, de elementos del tipo char. Es decir, las cadenas como tal no existen como tipo de dato básico de C, lo que existen son los caracteres, y las cadenas son arreglos o vectores de caracteres.

Para declarar una cadena en C puedes usar cualquiera de las formas:
Código (cpp) [Seleccionar]

char str[];
char *str;


donde la primera declara un arreglo de char, y la segunda declara un apuntador a tipo char, ya que en C los arreglos son también apuntadores, pero es otro tema de discusión ...

También se pueden hacer declaraciones donde se inicialice directamente el contenido:

char str[] = "hola mundo";

en la que automáticamente el compilador calcula la cantidad de espacio necesario en el array para albergar la cadena respectiva.

Ten en cuenta que toda cadena en C debe estar terminada por un carácter especial llamado "nulo", simbolizado por '\0'. Esto demarca el fin de la cadena, y por lo tanto la cantidad de espacio de memoria asignado a la cadena. De otro modo, si no se encontrara el fin de cadena, la misma abarcaría consecutivamente todos los bytes de memoria hasta invadir un área prohibida de la misma e incurriendo en lo que se llama violación de segmento.

Por esta razón siempre debes sumar un byte adicional al reservar espacio para tu cadena. Por ejemplo la cadena "hola" ocupa físicamente 5 bytes de la memoria, es decir 4 bytes más el nulo de terminación:

'h'  'o'  'l'  'a'  '\0'


Igualmente,  si una cadena tendrá n caracteres de longitud, debes declarar un arreglo de longitud n+1. Si la cadena msg deberá contener 100 caracteres como máximo entonces se declara:

char msg[101];

y así sucesivamente.

==================================================================
Dos funciones útiles de la biblioteca estándar de C para manipulación de cadenas (<string.h>) son strlen() y strcpy(). La primera calcula la longitud de la cadena, y la segunda copia el contenido de una cadena en otra (suponiendo que la cadena destino posee el espacio disponible suficiente). Ejemplos:

Código (cpp) [Seleccionar]

char str1[21];
char str2[22];

strcpy( str1, "soy una cadena");
printf( "str1 es: %s\n", str1 );
printf( "longitud de str1 es: %d", (int) strlen(str1) );
strcpy( str2, "soy otra cadena" );
printf( "str2 es: %s\n", str2 );
strcpy( str1, str2 );        /* copia str2 en str1 */
printf( "ahora str1 es: %s\n", str1 );



=========================
Espero haberte ayudado en una introducción al tema, cualquier cosa preguntas  ;)

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

sabeeee

#4
Yoel, muchas gracias, siempre dispuesto a ayudar a cambio de nada. int main(int argc, char *argv[]), aveces siento que molesto, pero yo decia de hacer algo parecido al argc pero que se pueda utilizar desde el mismo programa como si pusiese -pass hola ¿Te acordas? #include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main( int argc, char **argv)
{

  char clave[21];             /* espacio para 20 caracteres, pues 5 es muy poco */
  char clave2[21] = "hola"; /* clave del usuario */
  if ( argc < 3 ) { /* salir si hay menos de tres argumentos */
     printf("USO: programa -pass \"clave\" \n");
     return 1;
  }

  if ( !strcmp( argv[1], "-pass" ) ) {
     strncpy( clave, argv[2], 20 );
     clave[21] = '\0';
  }
  else
     return 1;

  if ( !strcmp(clave, clave2) )
  {
     printf("sencillo a ejecutar\n");
  }
  else
  {
     printf("Clave no valida\n");
  }

  return 0;


Voy a intentar improvisar un código en estos momentos.

se podria usar el strtok para esto?
"Vengándose, uno iguala a su enemigo; perdonando, uno se muestra superior a él."
Francis Bacon