TransWikia.com

No entiendo por que cambia el valor de la cadena char, siendo que solo modifico el primer carácter

Stack Overflow en español Asked by Ricardo Sebastin Quezada Armij on August 27, 2021

El objetivo es obtener en "newword" la palabra comprimida de word, como resultado "a2b1c4a3" pero se modifica el valor de "a" a una cadena gigante y eso se termino copiando por sprintf a "newword". Creo que debe ser la falta de algún que falta y se está pasando la dirección de a en vez de su contenido.


using namespace std;
int main()
{   
    
  char word[30]={};
  char newword[30]={};
  char a[1];
  int i,count;
  count = 0;
  strcpy(word,"aabcccccaaa");
  //strcpy(newword," ");
  printf("tiene largo %dn",strlen(word));
  a[0]=word[0];
  for(i=0; i<strlen(word)+1;i++)
  {

      if(a[0]==word[i])
        count++;
      else{
        printf("before: value a: %sn",a);
        sprintf(newword,"%s%s%d",newword,a,&count);
        printf("letra %s tiene largo %dn",a,count);
        printf("newword: %sn",newword);
        //a[1]='';
        a[0]=word[i];
        count=1;
        }
    
  }
  printf("newword: %s numero %dn",newword,strlen(newword));
  if(strlen(word)>strlen(newword)-1)
    printf("%s",newword);
  else
    printf("%s",word);
}

Imprime esto, el valor "a" va cambiando y se pierde el resultado.

tiene largo 11
before: value a: a
letra aa7339448 tiene largo 2
newword: a7339448
before: value a: ba7339448
letra ba7339448ba73394487339448 tiene largo 1
newword: a7339448ba73394487339448
before: value a: ca7339448ba73394487339448
letra ca7339448ba73394487339448ca7339448ba733944873394487339448 tiene largo 5
newword: a7339448ba73394487339448ca7339448ba733944873394487339448
before: value a: 4a7339448ba73394487339448ca7339448ba733944873394487339448
letra 4a7339448ba73394487339448ca7339448ba7339448733944873394484a7339448ba73394487339448ca7339448ba7339448733944873394487339448 tiene largo 1
newword: a7339448ba73394487339448ca7339448ba7339448733944873394484a7339448ba73394487339448ca7339448ba7339448733944873394487339448

--------------------------------
Process exited after 2.626 seconds with return value 3221225477
Presione una tecla para continuar . . .

One Answer

Tu problema está en esta línea:

sprintf(newword,"%s%s%d",newword,a,&count);

Al usar &count estas agregando a la string la dirección de la variable count, en vez de su contenido.

Te sugiero definir a como un tipo char y también utilizar %lu cuando utilizas strlen() para dar el formato correcto y evitar el warning.

Quedaría algo como así:

#include <iostream>
#include <string.h>


using namespace std;

int main()
{   
    
  char word[30]={};
  char newword[30]="";
  char a;//Mas facil definirlo como un char
  int i,count;
  count = 0;
  strcpy(word,"aabcccccaaa");
  //strcpy(newword," ");
  printf("tiene largo %lun",strlen(word));//%lu, porque es el tipo que devuelve que devuelve strlen
  a =word[0];
  for(i=0; i<strlen(word)+1;i++)
  {

      if(a==word[i])
        count++;
      else{
        printf("before: value a: %cn",a);
        sprintf(newword,"%s%c%d",newword,a,count);//&count = direccion de la variable count
        printf("letra %c tiene largo %dn",a,count);
        printf("newword: %sn",newword);
        //a[1]='';
        a=word[i];
        count=1;
        }
    
  }
  printf("newword: %s numero %lun",newword,strlen(newword));
  if(strlen(word)>strlen(newword)-1)
    printf("%s",newword);
  else
    printf("%s",word);
}

El motivo por el cuál te imprime mal el valor de la variable a es porqué a la hora de usar printf() deberías de:

1.Utilizar el formato %c para tu carácter a[0]:

#include <iostream>
#include <string.h>

using namespace std;
int main()
{   
    
  char word[30]={};
  char newword[30]={};
  char a[1];
  int i,count;
  count = 0;
  strcpy(word,"aabcccccaaa");
  //strcpy(newword," ");
  printf("tiene largo %lun",strlen(word));
  a[0]=word[0];
  
  for(i=0; i<strlen(word)+1;i++)
  {

      if(a[0]==word[i])
        count++;
      else{
        printf("before: value a: %cn",a[0]);
        sprintf(newword,"%s%c%d",newword,a[0],count);
        printf("letra %c tiene largo %dn",a[0],count);
        printf("newword: %sn",newword);
        //a[1]='';
        a[0]=word[i];
        count=1;
        }
    
  }
  printf("newword: %s numero %lun",newword,strlen(newword));
  if(strlen(word)>strlen(newword)-1)
    printf("%s",newword);
  else
    printf("%s",word);
}

2.Utilizar el formato %s y agregar el carácter de final de línea a tu variable a:

#include <iostream>
#include <string.h>

using namespace std;
int main()
{   
    
  char word[30]={};
  char newword[30]={};
  
  int i,count;
  count = 0;
  strcpy(word,"aabcccccaaa");
  //strcpy(newword," ");
  printf("tiene largo %lun",strlen(word));
  char a[2] ={word[0],''};//Necesitas 1 espacio para el caracter de final de línea
  
  for(i=0; i<strlen(word)+1;i++)
  {

      if(a[0]==word[i])
        count++;
      else{
        printf("before: value a: %sn",a);
        sprintf(newword,"%s%s%d",newword,a,count);
        printf("letra %s tiene largo %dn",a,count);
        printf("newword: %sn",newword);
        //a[1]='';
        a[0]=word[i];
        count=1;
        }
    
  }
  printf("newword: %s numero %lun",newword,strlen(newword));
  if(strlen(word)>strlen(newword)-1)
    printf("%s",newword);
  else
    printf("%s",word);
}

Correct answer by FranAcuna on August 27, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP