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. p>
4 Réponses :
Si votre plate-forme a 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. 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);
Lorsque vous passez un paramètre à une fonction en C, il en crée une copie, de sorte que la variable code> code> 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 code> code> sur la fonction Enregistrer_line, comme: P> et dans la principale: p>
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);
}
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
}