c - 我如何使用指针来使用 malloc 存储多个字符串

标签 c string pointers malloc file-handling

我尝试编写一个程序来动态分配内存以使用指针存储多个字符串,但它似乎无法工作。

#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/

相关文章:

string - Protractor - 获取浏览器标题作为字符串

C++ 堆栈被指针损坏

c++ - 将地址分配给指向指针的指针会产生段错误

c - 向指针添加一个整数有什么作用?

c++ - 是否可以更改与 Windows I/O 完成端口中的 HANDLE 关联的 ULONG_PTR 完成键?

python - 要列出的字符串,python

string - 使用 SwiftUI 在 UserDefaults 中保存来自 TextField 的字符串

c - 为什么在线程完成之前退出 main() 时在 C 的多线程应用程序中出现访问冲突?

c - 汇编输出+有关堆栈的问题

c - 在 Windows 7 上动态加载注册表功能?