jump - uninitialised value was created by a heap allocation
strstr char array dentro de struct array (5)
Agregado como respuesta según lo sugerido por mic_e
Suponiendo que está tratando de buscar un nombre de jugador con la entrada de un usuario, tiene los argumentos de strstr en el orden inverso. También tenga en cuenta que Strstr es sensible a mayúsculas y minúsculas.
char * p = strstr (jugadores [x] .name, inputFromUser);
Tengo una estructura definida como;
struct player {
int no, age;
char name[20];
} players[10];
Array está lleno del archivo. Lo que trato de hacer es, tomar la entrada del usuario, agregar la entrada a la matriz de caracteres, enviarla a la función de búsqueda (búsqueda de caracteres []) y campo de nombre strstr
en un bucle.
EDİT: Perdón por haber corregido el pedido. Estoy tratando de strstr en un bucle.
char *p = strstr(players[x].name, inputFromUser);
pero p
siempre es nulo. ¿Cómo puedo hacer esto?
Gracias por adelantado.
EDITAR - Código agregado ...
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
struct player {
int no, age;
char name[20];
} players[20];
void fillstruct(char *);
void search(char []);
int main(int argc, char *argv[])
{
int arg;
int c;
int d;
int i=0;
char a[100];
char *filename = NULL;
while((arg=getopt(argc, argv, "f:"))!=-1)
{
switch(arg)
{
case ''f'':
filename = optarg;
fillstruct(filename);
break;
default:
break;
}
}
while((c=fgetc(stdin))!=EOF)
{
if(c!=10)
{
a[i]=c;
i++;
}
else
{
a[i]=''/0'';
search(a);
i=0;
}
}
return 0;
}
void search(char a[])
{
int i=0;
int col;
int found=0;
char *p =NULL;
while((i<20)&&(found==0))
{
p = strstr(a, players[i].name);
if(p)
{
col = p-a;
printf("/nPlayer ''%s'' found in ''%s''.. Found index: %d", a, players[i].name, col);
found=1;
}
else
{
printf("/np=%s a=%s player[%d].name=%s", p, a, i, players[i].name);
}
i++;
}
}
void fillstruct(char *name)
{
FILE *fp;
char line[100];
int i=0;
fp = fopen(name, "r");
if(fp==NULL)
{
exit(1);
}
while(fgets(line, 100, fp)!=NULL)
{
players[i].no=i;
strcpy(players[i].name, line);
fprintf(stdout, "/nplayer=%s", players[i].name);
players[i].age=20;
i++;
}
fclose(fp);
}
Debería funcionar, es un error si tu entrada es incorrecta, déjame expandir en simple
int main()
{
char *ret;
char mystr[]="stack";
char str[]="This is stack over flow string";
ret = strstr(str, mystr);
printf("The substring is: %s/n", ret);
return(0);
}
La salida es
The substring is: stack over flow string
Eso significa
Esta función devuelve un puntero a la primera aparición en str
de cualquiera de la secuencia completa de caracteres especificada en mystr
, o un puntero nulo si la secuencia no está presente en str
.
Es una función sensible a mayúsculas y minúsculas si intenta buscar como
char mystr[]="Stack";//Note here first char is capital
Y obtuviste resultados como
The substring is: (null)
Puede comprobar su cadena de entrada y destino a su lado simplemente imprimiendo el contenido y verificando si es correcto o no.
printf("str1:%s str2:%s/n",players[x].name,inputFromUser)
char *p = strstr(players[x].name, inputFromUser);
Espero que esto aclare tus dudas.
Eso debería funcionar.
Creo que tienes el problema con la lectura de archivos que llena la matriz de datos.
Asegúrese de que los datos que haya completado en la estructura estén correctos.
Y strstr devuelve la dirección de la primera Ocurrencia de la cadena1 en la cadena2 donde, strstr (cadena2, cadena1);
Me gusta esto:
char *p = strstr(players[x].name, inputFromUser);
fgets
almacena el /n
y luego deja de tomar entrada.
Así que supongamos que un nombre de jugador es "user"
, los players[i].name
serán iguales a "user/n"
mientras que a
es "user"
.
Entonces el retorno de strstr
siempre es NULL
.
Pruebe esto en su lugar:
p = strstr(players[i].name,a);
O bien, elimine /n
después de tomar la entrada del archivo por fgets
:
while(fgets(line, 100, fp)!=NULL)
{
players[i].no=i;
strcpy(players[i].name, line);
players[i].name[strlen(players[i].name)-1]=''/0''; //add this line
fprintf(stdout, "/nplayer=%s", players[i].name);
players[i].age=20;
i++;
}