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 . . .
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