我尝试编写一个程序来动态分配内存以使用指针存储多个字符串,但它似乎无法工作。
#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");
}
最佳答案
您遇到了几个问题。首先,scanf 与 fgets 不能很好地配合 - 它会在输入流中留下换行符,这意味着当您调用 fgets 时它'我就读一下。解决此问题的最简单方法是在询问学生人数时使用 fgets
读取整行,并使用 sscanf
获取实际数字,如下所示:
char temp[100];
fgets(temp,100,stdin);
sscanf(temp,"%d",&num);
其次,您只创建一个非常大的长字符串,而不是多个字符串。因此,要创建 num
字符串,您首先要像这样分配字符串“数组”
names=malloc(sizeof(char *)*num);
然后使用循环为字符串分配空间
for(int i=0; i<num; i++)
{
names[i]=malloc(100);
}
您还将看到不需要转换 malloc
的返回值,但您确实需要包含正确的文件,即“stdlib.h”。从技术上讲,您不需要 sizeof(char)
因为它始终为 1。
您不会检查 fopen
的返回值,因此您不会处理无法打开文件进行写入的情况。
不知道为什么您还要在最后打开文件进行读取,因为您没有对它执行任何操作,并且当程序结束时它会自动关闭。
并且您应该始终养成编写代码来释放分配的内存的习惯,即使您不需要,因为代码就是这么简单。
从技术上讲,main
应该返回 int
。
代码的最终版本可能如下所示:
#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");
}
关于c - 我如何使用指针来使用 malloc 存储多个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54038441/