-1
votes

Passer une chaîne à la structure en c

Je suis terminé débutant en C et j'ai besoin d'aide pour enregistrer des chaînes dans les structures.

(J'ai essayé de multiples façons de le faire, mais que le programme n'imprime rien ou que j'ai (0xc0000005) ou le programme s'arrête. (J'ai essayé d'utiliser le pointeur en tant que paramètre, mais l'effet est identique - ou à l'aide de scanef à droite pour text.line et etc.). Je serais heureux que quelqu'un m'avait expliqué simplement comment cela devrait être fait - j'ai le sentiment que je ne comprends toujours pas parfaitement l'idée des indicateurs et c'est le problème; q. xxx


0 commentaires

4 Réponses :


0
votes

Strcpy code> ne copie que la chose pointée par la source à la destination. Il n'alloit pas l'espace dans la destination pour les affaires en cours de copie.

Si votre plate-forme a STRUP code>, vous pouvez l'utiliser à la place: P>

text.line = malloc(strlen(helper) + 1); // +1 for the null byte at the end
 strcpy(text.line, helper);


0 commentaires

2
votes

Lorsque vous passez un paramètre à une fonction en C, il en crée une copie, de sorte que la variable que vous avez dans Main n'est pas la même que celle que vous avez dans SAVE_LINE.

Vous devez transmettre un pointeur le texte sur la fonction Enregistrer_line, comme: xxx

et dans la principale: xxx < / pré>


0 commentaires

2
votes

Il n'y a pas d'espace pour allouer votre chaîne dans code> code>, car il ne s'agit que d'un pointeur initialisé, vous devrez donc réserver une mémoire pour cela. De plus, votre fonction est allouée à une mémoire qui n'est pas distribuée (et concernant assistant code>, vous n'auriez pas besoin de deux multiples de mémoire différentes pour la même chaîne).

#include<stdlib.h>
#include<stdio.h>

const uint8_t MAX_NAME_SIZE = 20;

typedef struct label{
    char *line;
}label;

void save_line(label text){
    printf("Write your name (max len %u chrs):\n",(MAX_NAME_SIZE-1));
    scanf("%s", text.line);
}

void main(){
    label text;
    text.line = malloc(MAX_NAME_SIZE);
    save_line(text);
    printf("%s", text.line);
    free(text.line);
}


0 commentaires

1
votes

Votre code est faux à de nombreux niveaux:

Vous voulez probablement quelque chose comme ceci: P>

#include <stdio.h>
#include <stdlib.h>

typedef struct label {
  char *line;
}label;

void save_line(label *text) {   // use label *ttext instead of label text
  printf("Write your name\n");
  text->line = malloc(30 * sizeof *text->line);   // no need for strcpy here anyway 
  scanf("%s", text->line);
}

int main() {               // main should return int *
  label text;
  save_line(&text);        // pass the pointer to text, not just text
  printf("%s", text.line);
  free(text.line);         // free allocated memory
}


0 commentaires