Violacion segmento en C Linux

Iniciado por Xin_J.D, 30 Marzo 2018, 13:14 PM

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

Xin_J.D

Hola muy buenas a todo el mundo.
Tengo que hacer una practica que consiste en hacer una calculadora que recibe los argumentos por linea de comando. Entonces el programa debe hacer la suma, resta, producto , cuociente y potencia.
Mi problema está en encontrar el signo de operacion ya que este no siempre está en la misma posicion.
En el comando podemos introducir por ejemplo 5x6 , 5x 6 , 5 x 6 , -5x6 , -5 x -6 etc.
Yo pensé en usar strcat para unir las cadena y usar un bucle for para encontrar el signo. Si el primer elemento es un signo k empiece por 0 sino por 1. una vez encontrado , break.
Pero en el main del hay un test que pone argv[1]="5.0" , argv[2]="+" , argv[3]="6.0". Alli es donde me da violacion de segmento en la funcion strcat
Espero que algun experto me pueda ayudar😁😁😁



int main(argc,*argv[ ])
{.....
argv[1]="5.0" ;
argv[2]="+" ;
argv[3]="6.0";

strcat(argv[1],argv[2]); // Aqui da violacion de segmento

.....
}

MAFUS

No deberías escribir en argv, es para pasarle información al programa.
Cuando uses strcat, strcpy y toda esta lista de instrucciones asegúrate de que el destino tiene el tamaño suficiente como para alojar la cadena de origen.

Para tu caso lo mejor sería crear un búffer que pudiera alojar toda la cadena, algo así como
char buffer[255] = {0};
for (int i=1; i<argc; ++i)
   strcat(buffer, argv[i]);

BloodSharp

#2
Cita de: MAFUS en 30 Marzo 2018, 16:16 PMNo deberías escribir en argv, es para pasarle información al programa.
Cuando uses strcat, strcpy y toda esta lista de instrucciones asegúrate de que el destino tiene el tamaño suficiente como para alojar la cadena de origen.

Para tu caso lo mejor sería crear un búffer que pudiera alojar toda la cadena, algo así como
char buffer[255] = {0};
for (int i=1; i<argc; ++i)
   strcat(buffer, argv[i]);

Como medida de seguridad adicional debería aparte no crear un buffer tan extenso que potencialmente podría ser usado para un ataque de ejecución por overflow:
int main(int argc,char*argv[])
{
   unsigned int uiTotalBufferSize=0;
   char*lpBuffer;
   register unsigned int i;
   for(i=1;i<argc;i++)
       uiTotalBufferSize+=strlen(argv[i]);
   lpBuffer=(char*)malloc(++uiTotalBufferSize);
   if(!lpBuffer)
       return 1;
   lpBuffer[0]=0;
   for(i=1;i<argc;i++)
       strcat(lpBuffer,argv[i]);
   HacerCalculo(lpBuffer);
   free(lpBuffer);
   return 0;
}