C 在循环的第一次迭代后将字符串更改为NULL。内存分配
程序应该从文件中获取字符串,并在其中找到字符串“delim”将它们分开。我应该使用动态记忆,但很抱歉我不能完美地使用它。在循环的第一次迭代后,将“cpystr”从“SUCCESSZOMBIEAAAAAAAaaaAZOMBIEaaAZOMBIEdf”更改为NULL的原因是什么?“successzombieaaaaaaaaaaazombieazombiedf”,其中“ZOMBIE”是“delim”。帮我修一下。谢谢您的帮助C 在循环的第一次迭代后将字符串更改为NULL。内存分配,c,string,visual-c++,memory,memory-management,C,String,Visual C++,Memory,Memory Management,程序应该从文件中获取字符串,并在其中找到字符串“delim”将它们分开。我应该使用动态记忆,但很抱歉我不能完美地使用它。在循环的第一次迭代后,将“cpystr”从“SUCCESSZOMBIEAAAAAAAaaaAZOMBIEaaAZOMBIEdf”更改为NULL的原因是什么?“successzombieaaaaaaaaaaazombieazombiedf”,其中“ZOMBIE”是“delim”。帮我修一下。谢谢您的帮助 #define _CRT_SECURE_NO_WARNINGS #inclu
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string>
char** split(const char *str, const char *delim)
{
int cntr1, cntr2, cntr3, cntdelim=0;
bool check;
//counting "delim" in the str
char **maspntr=NULL;
char *cpystr=NULL;
cpystr=_strdup(str); //reserve copy of the "cpy"
strcpy(cpystr,str);
for (cntr1=0;cntr1<(strlen(cpystr)+1);cntr1++) //THE PROBLEM WITH THIS CYCLE!
{
check=1;
for (cntr2=0, cntr3=cntr1;cntr2<strlen(delim); cntr2++, cntr3++) //searching for "delim"
if (!(cpystr[cntr3]==delim[cntr2]))
{
check=0;
break;
}
if (check) //if it's foound, it copies the first N characters as the first element of pointers' array
{
maspntr=(char**)realloc(maspntr,(cntdelim+1)*sizeof(char*));
maspntr[cntdelim]=(char*)calloc(cntr1, sizeof(char));
cntdelim++;
for (cntr3=0;cntr3<=(strlen(cpystr)-(cntr1+strlen(delim)-2));cntr3++)
{
cpystr[cntr3]=cpystr[cntr3+cntr1+strlen(delim)];
cpystr=(char*)realloc(cpystr,(strlen(cpystr)+1-cntr1-strlen(delim))*sizeof(char)); //delete first N characters +"delim" by copying the characters from the end then modifying memory
}
}
if(cpystr[cntr1]='\0') //if it is the end of string return
{
for (cntr1=0; cntr1<sizeof(maspntr); cntr1++)
{
printf(maspntr[cntr1],'\n');
}
free(cpystr);
return(maspntr);
}
} //Changing "cpystr" to NULL right here
}
int main()
{
char singlech;
int len=0;
//copy string from the file to the variable
FILE* foo;
errno_t err;
err=fopen_s(&foo,"input.txt","r");
if( err == 0 )
{
printf( "The file 'input.txt' was opened\n" );
}
else
{
printf( "The file 'input.txt' was not opened\n" );
}
while (!feof(foo)) //rather stupid way of getting memory
{
fscanf_s(foo, "%c", &singlech);
len++;
}
char *str=NULL, *delim=NULL;
str=(char*)calloc(len,sizeof(char));
rewind(foo);
fgets(str,len,foo);
delim=(char*)calloc(sizeof("ZOMBIE")+1, sizeof(char));
strcpy(delim,"ZOMBIE");
split(str,delim);
printf(str);
free(str);
free(delim);
getchar();
}
\define\u CRT\u SECURE\u NO\u警告
#包括
#包括
#包括
字符**拆分(常量字符*str,常量字符*delim)
{
int cntr1,cntr2,cntr3,cntdelim=0;
布尔检查;
//计算str中的“delim”
char**maspntr=NULL;
char*cpystr=NULL;
cpystr=_strdup(str);//保留“cpy”的副本
strcpy(cpystr,str);
对于(cntr1=0;cntr1我没有阅读您的所有代码,但是
cpystr = (char*)malloc(sizeof(cpystr))
分配“指针大小”字节(可能是4或8),因此如下strcpy()
写入超出分配的内存
你可能是说
cpystr = malloc(strlen(str) + 1); // casting the return value of malloc not needed
但是为什么不简单地写呢
cpystr = strdup(str);
你能从90多行代码调试器中缩小问题的范围吗?为什么不试试呢?我已经试过并找到了问题(请阅读说明)。在问题周期中添加了注释以使其更清晰。为什么您会降低代表级别,甚至不尝试提供帮助?如果您无法帮助解决问题,请帮助我编辑问题并使其更好。因为我甚至不知道strdup:)我会检查这个程序现在是否工作。它工作了,谢谢你的帮助。但是主要问题仍然存在。这是你的主要问题。你一遍又一遍地这样做。