如何将解析字符串放入malloc/calloc/动态内存中



我正在为期末考试做一些练习题。我在动态记忆方面遇到了很多麻烦。

所以这个问题基本上是想解析两个不同的来源,并比较它们来找到相似的单词。(一个来自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("%dn",k);
strcpy(&search[k],"");
***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,"");
free(csv);
free(search);
return(0);
}
  1. 我放在* *之间的部分是为了测试字符串是否被放在callloc中。但是什么都打印不出来,或者SMT奇怪的打印不出来。同样的代码用于后面的底部部分,它们要么是空的,要么只是打印出代码的奇怪碎片部分。
  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( "%sn", search[i] );
    free( search );
}

要查找的东西

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

这一行:

strcpy(&search[k],"");

你正在做的是将字符串字面值""添加到内存中的第k个位置(这可以工作…但总)。我相信你想这样做:

search[k] = ''

注意单引号(")是一个字符而不是字符串。

你也不应该强制转换malloc: char *search = (char *)malloc(...)

主要

:

您还应该考虑printf("%s", string)只打印到'string'中最近的终止符('')。参考这里。

所以检查你正在缓冲的东西,看看你是否能得出任何新的结论…

并且,当你打印字符串时,你只需要printf("%s", search)

强烈建议使用malloc(),特别是对于字符串。因为calloc()将所有值初始化为零。还有'' == 0,所以你可能会让自己更难诊断

相关内容

  • 没有找到相关文章

最新更新