Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Jay en 28 Octubre 2020, 03:22 am



Título: Ayuda con arreglo char
Publicado por: Jay en 28 Octubre 2020, 03:22 am
Hola amigos, tengo una duda con un arreglo char lo que pasa es que necesito que el arreglo que tengo declarada como w y quiero que se repita n veces  y tengo la invetida de w 2n veces, pero esa n quiero que sea capturada por el usuario
Código
  1.  
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5. #include<math.h>
  6.  
  7. char *invertir(char cadena[]) {
  8.  int longitud = strlen(cadena);
  9.  char temporal;
  10.  for (int izquierda = 0, derecha = longitud - 1; izquierda < (longitud / 2);
  11.       izquierda++, derecha--) {
  12.    temporal = cadena[izquierda];
  13.    cadena[izquierda] = cadena[derecha];
  14.    cadena[derecha] = temporal;
  15.  }
  16.  return cadena;
  17. }
  18.  
  19.  
  20.  
  21. int subCadena(char *cad, char *subCad, int ini, int fin)
  22. {
  23.    int iC, iS;
  24.  
  25.    if((ini>fin)|| (ini<0) || (fin>=strlen(cad)))
  26.        return 0;
  27.  
  28.    iS = 0;
  29.    for (iC = ini; iC<=fin; iC++){
  30.        subCad[iS] = cad[iC];
  31.        iS++;
  32.    }
  33.  
  34.    subCad[iS] = '\0';
  35.  
  36.    return 1;
  37.  
  38. }
  39.  
  40.  
  41. int subCadenaApellido(char *cad, char *subCad, int ini, int fin)
  42. {
  43.    int iC, iS;
  44.  
  45.    if((ini>fin)|| (ini<0) || (fin>=strlen(cad)))
  46.        return 0;
  47.  
  48.    iS = 0;
  49.    for (iC = ini; iC<=fin; iC+=8){
  50.        subCad[iS] = cad[iC];
  51.        iS++;
  52.    }
  53.  
  54.    subCad[iS] = '\0';
  55.  
  56.    return 1;
  57.  
  58. }
  59.  
  60. char *strstr(const char *haystack, const char *needle);
  61.  
  62.  
  63.  
  64. int main(){
  65.  
  66.  
  67.    char alfabeto[38]="1809669 mario alberto charles martinez",i[38], w[38],winv[38], j[38], lenguaje[34];
  68.    char cadena[37], k[37];
  69.    int n;
  70.  
  71.    printf("Introduce el valor de n: ");
  72.    scanf("%d", &n);
  73.  
  74.        printf("Introduce la cadena a verificar: ");
  75.        scanf("%s", &cadena);
  76.  
  77.    if(subCadena(alfabeto,i,0,6) == 0){
  78.  
  79.        printf("Error");
  80.  
  81.    }
  82.  
  83.    if(subCadenaApellido(alfabeto,w,22,30) == 0){
  84.  
  85.        printf("Error");
  86.    }
  87.  
  88.    for(int i=1; i<n; ++i){
  89.        k[i] = w;
  90.        printf("%s", k);
  91.  
  92.    }
  93.  
  94.    if(subCadena(alfabeto,i,0,6) == 0){
  95.  
  96.        printf("Error");
  97.  
  98.    }
  99.  
  100.    if(subCadenaApellido(alfabeto,winv,22,30) == 0){
  101.  
  102.        printf("Error");
  103.    }
  104.  
  105.     if(subCadena(alfabeto,j,8,12) == 0){
  106.  
  107.        printf("Error");
  108.  
  109.    }
  110.  
  111.    strcat(lenguaje, i);
  112.    strcat(lenguaje, w);
  113.    strcat(lenguaje, i);
  114.    strcat(lenguaje, invertir(winv));
  115.    strcat(lenguaje, j);
  116.    strcat(lenguaje, j);
  117.  
  118.  
  119.    if (strstr(lenguaje, cadena) != NULL) {
  120.    printf("Existe %s dentro de %s\n", cadena, lenguaje);
  121.    } else {
  122.    printf("No existe %s dentro de %s\n", cadena, lenguaje);
  123.    }
  124.  
  125. }
  126.  
  127.  
  128.  
  129.  

Espero me puedan ayudar, gracias


Título: Re: Ayuda con arreglo char
Publicado por: K-YreX en 29 Octubre 2020, 01:25 am
No entiendo muy bien tu problema...

Qué es lo que quieres repetir? Si pudieras poner un ejemplo concreto del resultado que quieres obtener igual es más fácil ayudarte.


Título: Re: Ayuda con arreglo char
Publicado por: Jay en 29 Octubre 2020, 22:06 pm
Hola Gracias por responder
Busco que por ejemplo el arreglo w este elevado a la n, esta n introducida por el usuario, y busco que el arreglo winv este elevada ala 2n , y que esos este dentro del arreglo lenguaje ya los repetidos, no se si me entiendas ahora.


Título: Re: Ayuda con arreglo char
Publicado por: K-YreX en 30 Octubre 2020, 00:05 am
Me sigue costando entender lo que quieres decir...
Intuyo que por "elevado a" quieres decir que su contenido esté repetido n veces, no?

Sería algo así si lo entiendo bien:
Código
  1. int main(){
  2.  char frase[] = "Hola";
  3.  int n = 3;
  4.  char fraseN[strlen(frase) * n + 1]; // Se suma 1 para el caracter final '\0'
  5.  for(int i = 0; i < n; ++i){
  6.    strcat(fraseN, frase); // Elimina el '\0', concatena la cadena e incluye otro '\0' al final
  7.  }
  8.  printf("%s\n", fraseN); // Resultado: HolaHolaHola
  9. }

Si no es eso lo que estás buscando concreta más con un ejemplo de lo que tienes y lo que quieres conseguir.


Título: Re: Ayuda con arreglo char
Publicado por: Jay en 4 Noviembre 2020, 05:11 am

En este ejemplo bro lo que quiero es que la cadena 1809669cm1809669cmcmmariomario me diga que si existe en el arreglo lenguaje pero me dice que no existe, por que a mi me imprime caracteres  especiales y no quiere funcionar no se como quitarlos puedes ayudar


Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<math.h>
  5.  
  6. char *invertir(char cadena[]) {
  7.  int longitud = strlen(cadena);
  8.  char temporal;
  9.  for (int izquierda = 0, derecha = longitud - 1; izquierda < (longitud / 2);
  10.       izquierda++, derecha--) {
  11.    temporal = cadena[izquierda];
  12.    cadena[izquierda] = cadena[derecha];
  13.    cadena[derecha] = temporal;
  14.  }
  15.  return cadena;
  16. }
  17.  
  18.  
  19.  
  20. int subCadena(char *cad, char *subCad, int ini, int fin)
  21. {
  22.    int iC, iS;
  23.  
  24.    if((ini>fin)|| (ini<0) || (fin>=strlen(cad)))
  25.        return 0;
  26.  
  27.    iS = 0;
  28.    for (iC = ini; iC<=fin; iC++){
  29.        subCad[iS] = cad[iC];
  30.        iS++;
  31.    }
  32.  
  33.    subCad[iS] = '\0';
  34.  
  35.    return 1;
  36.  
  37. }
  38.  
  39.  
  40. int subCadenaApellido(char *cad, char *subCad, int ini, int fin)
  41. {
  42.    int iC, iS;
  43.  
  44.    if((ini>fin)|| (ini<0) || (fin>=strlen(cad)))
  45.        return 0;
  46.  
  47.    iS = 0;
  48.    for (iC = ini; iC<=fin; iC+=8){
  49.        subCad[iS] = cad[iC];
  50.        iS++;
  51.    }
  52.  
  53.    subCad[iS] = '\0';
  54.  
  55.    return 1;
  56.  
  57. }
  58.  
  59. char *strstr(const char *haystack, const char *needle);
  60.  
  61.  
  62.  
  63. int main(){
  64.  
  65.    int n;
  66.    printf("Introduce el valor de n: \n");
  67.    scanf("%d",&n);
  68.  
  69.    int n2 = n*2;
  70.    char alfabeto[39]="1809669 mario alberto charles martinez",i[20], w[20],winv[20], j[20], lenguaje[60];
  71.    char cadena[37];
  72.    char fraseN[strlen(w) * n+1];
  73.    char fraseM[strlen(winv) * n+1];
  74.  
  75.    printf("El Alfabeto es: %s\n", alfabeto);
  76.  
  77.    if(subCadena(alfabeto,i,0,6) == 0){
  78.  
  79.        printf("Error");
  80.  
  81.    }
  82.  
  83.    if(subCadenaApellido(alfabeto,w,22,30) == 0){
  84.  
  85.        printf("Error");
  86.    }
  87.  
  88.  
  89.    if(subCadena(alfabeto,i,0,6) == 0){
  90.  
  91.        printf("Error");
  92.  
  93.    }
  94.  
  95.    if(subCadenaApellido(alfabeto,winv,22,30) == 0){
  96.  
  97.        printf("Error");
  98.    }
  99.  
  100.     if(subCadena(alfabeto,j,8,12) == 0){
  101.  
  102.        printf("Error");
  103.  
  104.    }
  105.  
  106.     printf("Introduce la cadena a verificar: \n");
  107.        scanf("%s", &cadena);
  108.  
  109.  
  110.        for(int i = 0; i < n; ++i){
  111.                strcat(fraseN, w);
  112.            }
  113.        for(int i = 0; i < n2; ++i){
  114.                strcat(fraseM, w);
  115.            }
  116.  
  117.        strcat(lenguaje, i);
  118.        strcat(lenguaje, fraseN);
  119.        strcat(lenguaje, i);
  120.        strcat(lenguaje, invertir(fraseM));
  121.        strcat(lenguaje, j);
  122.        strcat(lenguaje, j);
  123.  
  124.        printf("\n%s", lenguaje);
  125.  
  126.        if (strstr(lenguaje, cadena) != NULL) {
  127.            printf("\nExiste %s dentro del lenguaje", cadena);
  128.            } else {
  129.                printf("\nNo existe %s dentro del lenguaje", cadena);
  130.            }
  131.  
  132. }
  133.  
  134.  
  135.  


Al final lo que quiero 1809669cm1809669cmcmmariomario es lo que quiero que me diga que existe dentro de lenguae igual si le pongo la n debe aparecer 1809669cmcm1809669cmcmcmcmmariomario y que tambien existe es lo que busco

pΘu1809669ü■`cm1809669mcmc`■mmariomario a mi me imprime eso y pues me dice que no existe


Título: Re: Ayuda con arreglo char
Publicado por: K-YreX en 4 Noviembre 2020, 18:45 pm
Los problemas que tienes son los siguientes:
  • No inicializas las cadenas por lo que tienen basura y por eso te aparecen caracteres extraños.
En el ejemplo que te puse solo usé strcat() para que vieras su uso pero si la cadena no está inicializada hay que usar primero strcpy() para copiar el contenido y borrar la posible basura que haya y luego ya strcat().
Código
  1. int main(){
  2.  char frase[] = "Hola";
  3.  int n = 3;
  4.  char fraseN[strlen(frase) * n + 1]; // Se suma 1 para el caracter final '\0'
  5.  strcpy(fraseN, frase); // Copias el contenido de frase en fraseN eliminando la basura que pudiera tener
  6.  for(int i = 1; i < n; ++i){ // Empiezas el contador en 1 en vez de en 0 para no concatenar el contenido una vez mas
  7.    strcat(fraseN, frase); // Elimina el '\0', concatena la cadena e incluye otro '\0' al final
  8.  }
  9.  printf("%s\n", fraseN); // Resultado: HolaHolaHola
  10. }
  • En las líneas 72 y 73 no puedes usar strlen() porque esto te devuelve la longitud que tiene la cadena y no tienes ninguna cadena guardada. Lo que necesitas es que te devuelva la capacidad total del array y eso se consigue con sizeof().
  • En la línea 73 tienes que multiplicar por n2, no por n.
  • Las líneas 89-93 son innecesarias pues estás haciendo lo mismo que en las líneas 77-81.