c - 如何将已解析的字符串放入 malloc/calloc/动态内存中?

标签 c malloc dynamic-memory-allocation strtok calloc

所以我正在为即将到来的期末考试做一些练习题。我在动态内存方面遇到了很多麻烦。

所以这个问题基本上想通过 2 个不同的来源进行解析并比较它们以找到相似的词。 (一个来自 csv 文件,一个来自 cgi 输入)

所以我想我会使用 malloc/calloc 在每个数组槽中放入一个字符串,然后比较每个槽。但是我的代码有一些问题:

char buffer[100],buffer2[100],tmp[100],line[100];
char *token,*tok,*input;

int main()
{
char s[100]="search=cat+or+dog+store";
char *search=(char*)calloc(10,sizeof(char));

strcpy(buffer,s);
sscanf(buffer,"search=%s",buffer);
int k=0;
tok=strtok(buffer,"+");
   while(tok!=NULL)
   {
   strcpy(&search[k],tok);
    k++;
   tok=strtok(NULL,"+");
   }
printf("%d\n",k);
strcpy(&search[k],"\0");

***printf("%s",&search[0]);
   printf("%s",&search[1]);
   printf("%s",&search[2]);
   printf("%s",&search[3]);***

char* csv=(char*)calloc(10,sizeof(char));
char tmp2[100];

FILE *fp;
fp=fopen("web.csv","r");

  while(fgets(line,sizeof(line),fp)!=NULL)
  {
  strcpy(buffer2,line);
  token=strtok(buffer2,",");
      while(token!=NULL)
      {
      strcpy(csv,token);
      csv++;
      token=strtok(NULL,",");       
      } 
strcpy(csv,"\0");

free(csv);
free(search);
return(0);
}
  1. 我放在 * * 之间的部分是为了测试字符串是否放在 calloc 中。但没有打印出来或打印出奇怪的东西。相同的代码用于后面的底部,它们要么是空的,要么只打印出奇怪的代码片段。
  2. 当我放置 free(csv) 和 free(search) 时,它说“正在释放的指针未分配”。我查了一下,但我似乎无法找到它为什么这样做的答案?

谢谢!

最佳答案

您似乎在尝试创建一个指针数组。那么让我向您展示一下它的样子

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXT 10

int main( void )
{
    char s[100]="search=cat+or+dog+store";
    char buffer[100];
    char **search = calloc( MAXT, sizeof(char *) );
    if ( sscanf( s, "search=%s", buffer ) != 1 )
        return 1;
    int t = 0;
    char *token = strtok( buffer, "+" );
    while ( token != NULL && t < MAXT )
    {
        search[t++] = token;
        token = strtok( NULL, "+" );
    }
    for ( int i = 0; i < t; i++ )
        printf( "%s\n", search[i] );
    free( search );
}

要寻找的东西

  • search被声明为 char **表示指向 char 指针的指针,可以像 char 指针数组一样使用
  • calloc , 分配是针对 char * 类型的 10 个项目,即 10 个指针的数组
  • sscanf ,输入和输出字符串不能是同一个字符串。我更改了参数,以便 s是输入,buffer是输出。此外,您应该始终检查 sscanf 的返回值等于请求的项目数。
  • while循环,我添加了一个支票 t < MAXT避免跑过指针数组的末尾
  • search是一个指针数组,strtok返回一个指针,所以行 search[t++]=token;将指针存储在数组中。字符串本身仍在 buffer 中.

关于c - 如何将已解析的字符串放入 malloc/calloc/动态内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38905213/

相关文章:

java - C 比 JAVA 执行时间更长

c - 如何将这个 "normal"数组变成指针数组?

我们可以使用数组的表示法来表示 malloc 分配的内存吗?

c - 如何正确释放 malloc 的结构?

c - 为什么这个 C 程序不允许我访问内存?

在 C 中初始化结构数组的编译器错误(数组必须用大括号括起来的初始化器初始化)

可以通过以下方式将结构转换为不同的大小吗?

c - 嵌入式系统上的 malloc 行为

c++ - 将运算符 new[] 和放置 new 与普通 delete[] 混合

fortran - Fortran 中的未知大小矩阵