uninitialised jump created c arrays struct char strstr

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++; }