如何将解析后的字符串放入malloc/calloc/dynamic内存中?
所以我正在为即将到来的期末考试做一些练习题。我的动态记忆有很多问题 所以这个问题基本上是通过两个不同的来源进行解析,并对它们进行比较,找到相似的单词。(一个来自csv文件,一个来自cgi输入) 所以我想我应该使用malloc/calloc在每个数组插槽中放入一个字符串,然后比较每个插槽。但我的代码有一些问题:如何将解析后的字符串放入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
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);
}
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
类型的10个项目,即10个指针的数组char*
- 在
中,输入和输出字符串不能是相同的字符串。我更改了参数,使sscanf
是输入,s
是输出。此外,您应该始终检查buffer
的返回值是否等于请求的项目数李>sscanf
- 在
循环中,我添加了一个checkwhile
,以避免运行超过指针数组的末尾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++中,它是强制的。