J'ai essayé de faire un programme pour allouer de manière dynamique la mémoire pour stocker plusieurs chaînes à l'aide de pointeurs, mais cela ne peut pas sembler fonctionner.
#include <stdio.h>
#include<conio.h>
void main()
{
FILE *fp;
int num;
printf("enter no of students");
scanf("%d",&num);
char *names = (char*) malloc(num * 100 * sizeof(char));
printf("enter the names");
fp = fopen("file.txt","w");
for (int i = 0; i < num; i++)
{
fgets(*(names + i * 100), 100, stdin);
fprintf(fp, "%s\n", (names + i * 100));
}
fclose(fp);
fp = fopen("file.txt", "r");
printf("names stored in *ptr");
}
4 Réponses :
Vous devez avoir une table des pointeurs au char.
char **strtable = NULL
size_t nstrings = 0;
int addstring(const char *str)
{
int result = -1;
char **tmp = realloc(strtable, (nstrings + 1)* sizeof(*strtable));
if(tmp)
{
tmp[nstrings] = malloc(strlen(str) + 1);
if(tmp[nstrings])
{
result = 0;
strtable = tmp;
strcpy(tmp[nstrings++], str);
}
}
return result;
}
Il connaît le nombre d'élèves de sorte qu'il n'a pas à ré-effectivement réalloc sur chaque appel: scanf ("% d", & num); code>. Il n'a pas non plus besoin d'une fonction séparée pour le faire: il suffit de l'intégrer dans son principal code>.
Strlen (String) Code> ==> SHLEN (STR) code>
@Paulogilvie 1. Je lui montraise le chemin, ne donnant pas le code le plus efficace sur la planète. L'efficacité BTW de Realloc dans ce cas est inférieure à marginale. 2. C est la langue de la procédure et c'est une très mauvaise habitude d'intégrer tout en raison. Peut-être que vos programmes ont une massive de 50000 lignes principale et aucune fonction, mais ce n'est pas l'exemple à suivre. Je considère votre commentaire comme un nitpick
@ 4386427 Oui Vous avez raison, alors pourrait éventuellement avoir un éditeur de code normal. Il est temps de passer au 21ème siècle
@P__J__ Vous n'êtes pas sûr de savoir pourquoi vous écrivez ce commentaire pour moi. Je ne fais pas le So Ui. Je viens de vous aider à améliorer votre réponse.
@P__JJ__ Si c'était une remarque générale, pourquoi l'avez-vous marqué pour moi?
Je suis d'accord avec la réponse ci-dessus, mais si vous souhaitez conserver la même structure, vous allez
#include<stdio.h>
#include<conio.h>
void main()
{
FILE *fp;
int num;
printf("enter no of students ");
scanf("%d",&num);
char *names=malloc(num*100);
printf("enter the names\n");
fp=fopen("file.txt","w");
fseek(stdin,0,SEEK_END);
for(int i=0;i<num;i++)
{
fgets((names + i * 100), 100, stdin);
fprintf(fp, "%s", (names + i * 100));
fseek(stdin,0,SEEK_END);
}
fclose(fp);
fp=fopen("file.txt","r");
printf("names stored in *ptr");
fclose(fp);
}
1) Veuillez indenter le code correctement. 2) Pourquoi utiliser fseek code>?
J'ai utilisé Fsek pour effacer correctement le tampon STDIN après la première entrée 'Num'
Vous avez plusieurs problèmes. Tout d'abord scanf code> ne joue pas bien avec fgets code> - il laissera une nouvelle ligne dans le flux d'entrée qui signifie lorsque vous appelez fgets code> ll juste lire ça. Le moyen le plus simple de résoudre consiste à utiliser fgets code> pour lire dans toute la ligne lorsque vous demandez le nombre d'étudiants et sscanf code> pour obtenir le numéro réel comme ceci: #include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp;
int num;
char temp[100];
printf("enter no of students");
fgets(temp,100,stdin);
sscanf(temp,"%d",&num);
char **names=malloc(num*sizeof(char*));
printf("enter the names");
fp=fopen("file.txt","w");
if(fp==NULL)
{
printf("Failed to open\n");
return 1;
}
for(int i=0;i<num;i++)
{
names[i]=malloc(100);
fgets(names[i],100,stdin);
fprintf(fp,"%s\n",names[i]);
}
fclose(fp);
for(int i=0;i<num;i++)
{
free(names[i]);
}
free(names);
printf("names stored in *ptr");
}
L'approche la plus simple consiste à déclarer des noms code> comme "un pointeur sur un tableau de 100 caractères" et utilisez un seul masloc. Après cela, vous pouvez simplement accéder au nom individuel à l'aide de noms comme ceci: p> [i] code>. printf("enter the names\n");
fp = fopen("file.txt","w");
for (int i = 0; i < num; i++)
{
char name[100];
fgets(name, 100, stdin);
fprintf(fp, "%s", name);
}
fclose(fp);
Vous allouez un tableau seulement. Je crois que vous aviez besoin d'un
Char ** noms code> variable, puis allocation 100 tableaux de 100 espaces ... ou, vous pouvez réutiliser la matrice lors de la lecture de l'entrée ...