Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将解析后的字符串放入malloc/calloc/dynamic内存中?_C_Malloc_Dynamic Memory Allocation_Strtok_Calloc - Fatal编程技术网

如何将解析后的字符串放入malloc/calloc/dynamic内存中?

如何将解析后的字符串放入malloc/calloc/dynamic内存中?,c,malloc,dynamic-memory-allocation,strtok,calloc,C,Malloc,Dynamic Memory Allocation,Strtok,Calloc,所以我正在为即将到来的期末考试做一些练习题。我的动态记忆有很多问题 所以这个问题基本上是通过两个不同的来源进行解析,并对它们进行比较,找到相似的单词。(一个来自csv文件,一个来自cgi输入) 所以我想我应该使用malloc/calloc在每个数组插槽中放入一个字符串,然后比较每个插槽。但我的代码有一些问题: char buffer[100],buffer2[100],tmp[100],line[100]; char *token,*tok,*input; int main() { char

所以我正在为即将到来的期末考试做一些练习题。我的动态记忆有很多问题

所以这个问题基本上是通过两个不同的来源进行解析,并对它们进行比较,找到相似的单词。(一个来自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);
}
  • 我放在**之间的部分是为了测试字符串是否放在calloc中。但没有打印出来或smt怪异打印出来。后一个底部部分使用了相同的代码,它们要么是空的,要么只是打印出代码中奇怪的片段部分
  • 当我放了自由(csv)和自由(搜索)时,它说“指针被释放是没有分配的”。我查了一下,但似乎找不到它为什么会这样的答案 谢谢大家!

    这里的这一行:

    strcpy(&search[k],"\0");
    
    您要做的是将字符串文字“\0”添加到内存中的第k个位置(这可以工作…但很粗糙)。我相信你正试图做到这一点:

    search[k] = '\0'
    
    请注意,单引号(“”)是一个字符,而不是字符串文字

    您也不应该是
    char*search=(char*)malloc(…)

    主要是

    您还应该考虑,在“字符串”中,直到“最近的终止符(<代码>)0”/代码>之前,代码> PrtTf(“%s”)、“字符串”才打印出来。参考资料

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

    而且,当您打印字符串时,只需
    printf(“%s”,search)


    我强烈建议您使用malloc(),尤其是字符串。因为calloc()会将所有值初始化为零。和
    '\0'==0
    ,因此您可能会使自己的诊断更加困难。

    您似乎正在尝试创建一个指针数组。让我给你看看那是什么样子

    #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 );
    }
    
    #包括
    #包括
    #包括
    #定义最大值10
    内部主(空)
    {
    char s[100]=“搜索=猫+或+狗+商店”;
    字符缓冲区[100];
    char**search=calloc(MAXT,sizeof(char*));
    如果(sscanf,“搜索=%s”,缓冲区)!=1)
    返回1;
    int t=0;
    char*token=strtok(缓冲区“+”);
    while(令牌!=NULL&&t
    要找的东西

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

      • sscanf(缓冲区,“搜索=%s”,缓冲区)?嗯……这是为了去掉传递的cgi字符串的“search=”部分,它看起来像这样:seach=dog+或+cat+store。我不需要搜索部分为什么*在sizeof内搜索?我以为只有“类型”在里面。我也试过了,它有smt吗?但是:(也没有任何意义。最后一个标记化的单词被混入其中,剩下的看起来都是杂乱无章的字符。@harekuin我提到它是因为,根据C11§7.21.6.7/2,关于
        sscanf
        ,“如果复制发生在重叠的对象之间,行为是未定义的。”-
        buffer
        当然与
        buffer
        重叠。我最初在while循环中有一个printf语句来检查缓冲区和令牌以及放入malloc的部分。它在循环中工作正常。但我离开while循环smt的那一刻出错了。我最初编写的代码也是这样的:虽然(tok!=NULL){strcpy(search,tok);search++;tok=strtok(NULL,“+”);}我的印象是,为了将smt放在malloc中,我们必须取消引用,但显然不是???我也不明白这是如何工作的。(一旦我离开循环,仍然不知道)我认为有助于您理解的是,
        search[5]=*(search+5)
        …因此,使用此选项,您可以看到在使用
        strcpy(&search[k]…)
        @harekuin时正在做什么。注意:这是因为
        strtok
        替换了分隔符(“+”)使用null char.omg你们这些家伙的用户3386109非常感谢你们的深入解释和@johnnymapp给我发送的所有链接和评论!这很有帮助!只是一个简单的问题。为什么我不需要键入cast calloc?我想是的mandatory@harekuin在C++中,它是强制的。