Problema 1:
Decir el nº de argumentos que recibe un programa en la linea del terminal
#include <stdio.h>
int main(int argc, char **argv)
{
int c=0; // contador
while (c<argc) {
printf("Argumento nº %d, es el %s \n",c,argv[c]);
c++;
}
return 0;
}
2º
Problema que recibe dos argumentos ademas del nombre del programa.
Indicar si el primer argumento se encentra dentro del segundo.
1º opcion: Método usando función strstr
#include <stdio.h>
#include <string.h>
int busca(char *,char *);
int main(int argc, char **argv)
{
int c=1; // contador leo a partr de la segunda cadena
int c2=0; //contador en la 1 cadena
int c3=0; //contador en la 2 cadena
int resultado=0; // resultado de una busqueda
while (c<3) {
printf("Argumento nº %d, es: %s \n",c,argv[c]);
c++;
}
c=1;
while (c<3) {
printf("%s ...... %d \n",argv[c],strlen(argv[c]));
c++;
}
if (strlen(argv[1])>strlen(argv[2])) {
printf("El primer argumento es de mayor longitud que el segundo, por lo tanto no esta incluido... adios\n");
} else {
// vamos a buscar la cadena dentro de la otra...
c2=0;
c3=0;
resultado=0;
resultado=busca(argv[2],argv[1]); // el primer argumento es el
texto donde deseo buscar, y el segundo es el texto a buscar
if (resultado==10) {
printf("BIEN.... LO HE ENCONTRADO \n");
} else {
printf("No lo he encontrado \n");
}
}
return 0;
}
//----------------------------------------------------------------------------------------------------------------
int busca(char *palabra1,char *palabra2)
{
if (strstr(palabra1,palabra2)!=NULL) {
//hemos encontrado la palabra dentro de la otra
return 10;
}
return 1;
}
2º opcion creando una “subpalabra” para compararla
#include <stdio.h>
#include <string.h>
int busca(char *,char *);
int main(int argc, char **argv)
{
int c=1; // contador leo a partr de la segunda cadena
int c2=0; //contador en la 1 cadena
int c3=0; //contador en la 2 cadena
int resultado=0; // resultado de una busqueda
while (c<3) {
printf("Argumento nº %d, es: %s \n",c,argv[c]);
c++;
}
c=1;
while (c<3) {
printf("%s ...... %d \n",argv[c],strlen(argv[c]));
c++;
}
if (strlen(argv[1])>strlen(argv[2])) {
printf("El primer argumento es de mayor longitud que el segundo, por lo tanto no esta incluido... adios\n");
} else {
// vamos a buscar la cadena dentro de la otra...
c2=0;
c3=0;
resultado=0;
resultado=busca(argv[2],argv[1]);
// el primer argumento es el texto donde deseo buscar, y el segundo es el texto a buscar
if (resultado==10) {
printf("BIEN.... LO HE ENCONTRADO \n");
} else {
printf("No lo he encontrado \n");
}
}
return 0;
}
//
// el primer argumento (palabra1) es el texto donde deseo buscar, y el segundo es el texto a buscar (palabra2)
//
int busca(char *textolargo,char *textocorto)
{
int c=0;
int c2=0;
int valor=0;
char subpalabra[100];
while (c<strlen(textolargo)) {
// crear subpalabra del texto largo
c2=0;
while (c2<(strlen(textocorto))) {
subpalabra[c2]=textolargo[c+c2];
c2++;
}
subpalabra[c2]='\0';
// nota: para señalar caracter lo ponemos entre comilla simple ('), si es una cadena ("), comillas dobles.
printf("subpalabra: %s %s \n",subpalabra,textocorto);
if (strcmp(subpalabra,textocorto)==0){
//hemos encontrado la palabra dentro de la otra
// lo he encontrado en la posicion c
printf("Encontrado en %d. \n",c+1); // muestra la posicion donde lo he encontrado...
valor= 's';
break;
}
c++;
}
if (valor=='s') {
return 10;
} else {
return 0;
}
}
3º Metodo: solucion del profesor:
(se limita a trabajar con 2 argumentos (por eso comprueba distinto a 3
(0 es el nombre del progrmas, 1, es el 1º argumento y 2 es el 2º
argumento)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FALSE 0 // nos creamos los valore booleanos
#define TRUE !FALSE // nos creamos los valore booleanos
int main(int argc, char **argv)
{
int tamP1;
int tamP2;
int c2 = 0;
int posicion = 0;
int despla = 0;
int encontrado = FALSE;
// Comprobaciones previas
// Son necesarios 3 argumentos
if(argc != 3) {
printf("%s: Uso: %s palabra_buscada palabra_en_la_que_se_busca\n", argv[0], argv[0]);
exit(1);
}
tamP1 = strlen(argv[1]);
tamP2 = strlen(argv[2]);
// Si palabra1 es más larga que palabra2, es imposible que esté contenida en palabra2
if(strlen(argv[1]) > strlen(argv[2])) {
return 0;
}
// Mientras en palabra2 queden suficientes letras para que pueda contener palabra1
// Busca la primera letra de palabra 1 en palabra 2
// con tamP2-tamP1 limito mas la busqueda.
for(c2 = 0; c2 <= tamP2 -tamP1 && !encontrado; c2++) {
// Coincide la primera letra de palabra1
if(argv[1][0] == argv[2][c2]) {
// Busca el resto de las letras de palabra 1 a partir de donde se encontró la primera en palabra2:argv[1][despla] == argv[2][c2 + despla] && argv[1][despla] != '\0'
for(despla = 0; argv[1][despla] == argv[2][c2 + despla] && argv[1][despla] != '\0'; despla++) {
//este bucle no tiene contenido porque la propia condicion del
for, esta haciendo todo lo que esta, darnos el valor de despla
}
// Si despla llega a tamP1 indica que se a recorrido palabra1 por completo y coincide
if(despla == tamP1) {
posicion = c2;
encontrado = TRUE;
}
}
}
// Si encontrado=True, muestra la posicion.
if(encontrado) {
printf("%d\n", posicion); //
te dice la posicion donde lo ha encontrado (incluso mejor quitarle \n),
para que sea mas facil la lectura de ese dato por otro
programa....(estamos creando pequeñas herramientas de programas de
sistemas para luego hacer mas cosas directamente con el sistema)
}
return 0;
}
No hay comentarios:
Publicar un comentario