如何将已解析的字符串放入 malloc/calloc/dynamic 内存中?
how to put a parsed string inside of malloc/calloc/dynamic memory?
所以我正在为即将到来的期末考试做一些练习题。我在动态内存方面遇到了很多麻烦。
所以这个问题基本上是想通过 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],"[=11=]");
***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,"[=11=]");
free(csv);
free(search);
return(0);
}
- 我放在 * * 之间的部分是为了测试字符串是否放在 calloc 中。但没有打印出来或打印出奇怪的东西。相同的代码用于后面的底部,它们要么是空的,要么只打印出奇怪的代码片段。
- 当我输入 free(csv) 和 free(search) 时,它说 "pointer being freed was not allocated"。我查了一下,但我似乎无法找到它为什么这样做的答案?
谢谢!
这里是这一行:
strcpy(&search[k],"[=10=]");
您正在做的是将字符串文字“\0”添加到内存中的第 k 个位置(有效……但很恶心)。我相信您正在尝试这样做:
search[k] = '[=11=]'
请注意单引号 ('') 是字符而不是字符串文字。
你也不应该casting a malloc:char *search = (char *)malloc(...)
主要:
您还应该考虑到 printf("%s", string)
只会打印到 'string' 中最近的终止符 ('[=14=]'
)。参考 here.
所以检查一下你在缓冲什么,看看你是否可以得出任何新的结论...
并且,当您打印字符串时,您只需要 printf("%s", search)
我强烈建议您使用 malloc(),尤其是对于字符串。因为 calloc() 将所有值初始化为零。 '[=16=]' == 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 );
}
要寻找的东西
search
声明为 char **
表示指向字符指针的指针,可以像字符指针数组一样使用
- 在
calloc
中,分配了10个char *
类型的项目,即10个指针的数组
- 在
sscanf
中,输入和输出字符串不能是同一个字符串。我更改了参数,以便 s
是输入,buffer
是输出。此外,您应该始终检查 sscanf
中的 return 值是否等于请求的项目数。
- 在
while
循环中,我添加了一个检查 t < MAXT
以避免 运行 超过指针数组的末尾
search
是一个指针数组,而strtok
return是一个指针,所以search[t++]=token;
行把指针存放在数组中。字符串本身仍在 buffer
.
所以我正在为即将到来的期末考试做一些练习题。我在动态内存方面遇到了很多麻烦。
所以这个问题基本上是想通过 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],"[=11=]");
***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,"[=11=]");
free(csv);
free(search);
return(0);
}
- 我放在 * * 之间的部分是为了测试字符串是否放在 calloc 中。但没有打印出来或打印出奇怪的东西。相同的代码用于后面的底部,它们要么是空的,要么只打印出奇怪的代码片段。
- 当我输入 free(csv) 和 free(search) 时,它说 "pointer being freed was not allocated"。我查了一下,但我似乎无法找到它为什么这样做的答案?
谢谢!
这里是这一行:
strcpy(&search[k],"[=10=]");
您正在做的是将字符串文字“\0”添加到内存中的第 k 个位置(有效……但很恶心)。我相信您正在尝试这样做:
search[k] = '[=11=]'
请注意单引号 ('') 是字符而不是字符串文字。
你也不应该casting a malloc:char *search = (char *)malloc(...)
主要:
您还应该考虑到 printf("%s", string)
只会打印到 'string' 中最近的终止符 ('[=14=]'
)。参考 here.
所以检查一下你在缓冲什么,看看你是否可以得出任何新的结论...
并且,当您打印字符串时,您只需要 printf("%s", search)
我强烈建议您使用 malloc(),尤其是对于字符串。因为 calloc() 将所有值初始化为零。 '[=16=]' == 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 );
}
要寻找的东西
search
声明为char **
表示指向字符指针的指针,可以像字符指针数组一样使用- 在
calloc
中,分配了10个char *
类型的项目,即10个指针的数组 - 在
sscanf
中,输入和输出字符串不能是同一个字符串。我更改了参数,以便s
是输入,buffer
是输出。此外,您应该始终检查sscanf
中的 return 值是否等于请求的项目数。 - 在
while
循环中,我添加了一个检查t < MAXT
以避免 运行 超过指针数组的末尾 search
是一个指针数组,而strtok
return是一个指针,所以search[t++]=token;
行把指针存放在数组中。字符串本身仍在buffer
.