【100】 一小时内结帖
单步调一点儿问题都没有,一执行就说段溢出
还想问问,如果我在函数内给char **p malloc空间,然后往里面写数据
然后return p,那么p指向的内容是不是已经作为局部变量而被释放掉了呢?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define OPT_STRTOK_DIVIDEALL 0 /* divide the input string in details
*/
#define OPT_STRTOK_DEFAULT 1 /* divide the input string into ONLY two pa
rt */
#define SUB_STRING_LENTH 20 /* each sub-string lenth */
int iar_strtok_len ;
int iar_strtok(char * src,char *flag,int option,char *des[]){
int i, j,len;
char *p,*q;
i = j = 0;
/*
* Format input string
*/
len = strlen(src) -1;
while(isspace(src[len])){
src[len] = '\0';
len--;
}
/* divide string */
q = strtok(src,flag);
strncpy(des[j],q,strlen(q));
j++;
while((p = strtok(NULL,flag)) ){
strncpy(des[j],p,strlen(p));
j++;
if( option != OPT_STRTOK_DIVIDEALL)
if(j >= option)
break;
}
return j;
}
int main(){
char * str = "aaa bbb ccc ddd eee fff";
char *part[10];
int i = 0;
int on = OPT_STRTOK_DIVIDEALL;
for( i = 0; i < 10; i++)
part[i] = (char *)malloc(SUB_STRING_LENTH);
iar_strtok_len = iar_strtok(str," ",on,part);
for(i = 0;i < iar_strtok_len; i++){
fprintf(stdout,"part %d : %s\n",i,part[i]);
}
return 0;
}
问题点数:100、回复次数:22Top
1 楼nodummy(三甲 之 Linux/Unix里面甭给我分,谁给我分我和谁急)回复于 2005-03-13 18:55:23 得分 0
先说说这段代码干啥的?Top
2 楼llmsn("若虚"即"虚怀若谷"!!!)回复于 2005-03-13 18:55:37 得分 0
1楼啊.Top
3 楼llmsn("若虚"即"虚怀若谷"!!!)回复于 2005-03-13 18:56:00 得分 0
555,成2楼了.Top
4 楼Student02370236(★★★★★★)回复于 2005-03-13 19:03:18 得分 0
楼主这是个词法分析的程序吗?Top
5 楼Student02370236(★★★★★★)回复于 2005-03-13 19:04:19 得分 0
函数内部的char* p是返不回去的,在函数返回的时候就被销毁了Top
6 楼heuristic(懵懂书童||十年面壁图破壁)回复于 2005-03-13 19:04:32 得分 0
功能:
同strtok差不太多,就是把字符串分割成子串,每个子串分别存放在part[i]中Top
7 楼pcboyxhy(-273.15℃)回复于 2005-03-13 19:10:59 得分 10
int *foo( void )
{
int *p=new int[100];
写数据;
return p;
}
这个是没有问题的。Top
8 楼Student02370236(★★★★★★)回复于 2005-03-13 19:17:13 得分 0
楼主的程序在单步调试的时候也会出在问题,在q = strtok(src,flag); 语句会出现段异常Top
9 楼EnochShen(小疯子:真的好菜—知耻而后勇!)回复于 2005-03-13 19:19:14 得分 50
1.char * str = "aaa bbb ccc ddd eee fff"; 是指向常量的指针,你不能改变他,strtok肯定会出错.
char* str = new char[24];
memcpy(str,"aaa bbb ccc ddd eee fff",24);
...
delete[] str;
return 0;
2.strncpy(des[j],q,strlen(q));考完了之后要把最后一位赋值为0,要不输出的结果会有问题
strncpy(des[j],q,strlen(q));
des[j][strlen(q)] = '\0';//添加的
j++;
while((p = strtok(NULL,flag)) )
{
strncpy(des[j],p,strlen(p));
des[j][strlen(p)] = '\0';//添加的
j++;
if( option != OPT_STRTOK_DIVIDEALL)
if(j >= option)
break;
}
return j;
输出结果:
part 0 : aaa
part 1 : bbb
part 2 : ccc
part 3 : ddd
part 4 : eee
part 5 : fff
Press any key to continue
Top
10 楼prgmBaggio(only C)回复于 2005-03-13 19:20:03 得分 0
还想问问,如果我在函数内给char **p malloc空间,然后往里面写数据
然后return p,那么p指向的内容是不是已经作为局部变量而被释放掉了呢?
-------------------------------------------------------------------------
当然,函数调用结束返回已经被KILL掉的内存当然会报错Top
11 楼Student02370236(★★★★★★)回复于 2005-03-13 19:21:50 得分 20
我将楼主的主程序改成:
int main(){
√char * str;
char *part[10];
int i = 0;
int on = OPT_STRTOK_DIVIDEALL;
√str=(char *)malloc(50*sizeof(char));
strcpy(str,"aaa bbb ccc ddd eee fff");
for( i = 0; i < 10; i++)
part[i] = (char *)malloc(SUB_STRING_LENTH);
iar_strtok_len = iar_strtok(str," ",on,part);
for(i = 0;i < iar_strtok_len; i++){
fprintf(stdout,"part %d : %s\n",i,part[i]);
}
system("PAUSE");
return 0;
}
打勾的是我改的
改正以后程序就可以正常运行了Top
12 楼Student02370236(★★★★★★)回复于 2005-03-13 19:22:27 得分 0
也就是说应该先为str分配空间,再把字符串存入Top
13 楼EnochShen(小疯子:真的好菜—知耻而后勇!)回复于 2005-03-13 19:23:33 得分 0
to 楼上,malloc所申请的空间在堆上,不会被释放Top
14 楼nodummy(三甲 之 Linux/Unix里面甭给我分,谁给我分我和谁急)回复于 2005-03-13 19:23:59 得分 5
还是小疯子比较仔细……
不过更简单的方法是char str[] = "aaa bbb ccc ddd eee fff"; 这样就可以了
另外strncpy不需要置'\0'吧?不过这样不是很安全,MSDN如是说:
The strncpy function copies the initial count characters of strSource to strDest and returns strDest. If count is less than or equal to the length of strSource, a null character is not appended automatically to the copied string.Top
15 楼EnochShen(小疯子:真的好菜—知耻而后勇!)回复于 2005-03-13 19:25:10 得分 0
汗,刷新的好快,应该是 to prgmBaggioTop
16 楼EnochShen(小疯子:真的好菜—知耻而后勇!)回复于 2005-03-13 19:26:33 得分 5
呵呵,如果不设为.结果是:
part 0 : aaa屯屯屯屯屯屯屯屯妄鼳
part 1 : bbb屯屯屯屯屯屯屯屯妄鼳
part 2 : ccc屯屯屯屯屯屯屯屯妄鼳
part 3 : ddd屯屯屯屯屯屯屯屯妄鼳
part 4 : eee屯屯屯屯屯屯屯屯妄鼳
part 5 : fff屯屯屯屯屯屯屯屯妄鼳
Press any key to continue
Top
17 楼EnochShen(小疯子:真的好菜—知耻而后勇!)回复于 2005-03-13 19:28:41 得分 5
他des没有初始化,所以要在最后加一个0的,呵呵Top
18 楼nodummy(三甲 之 Linux/Unix里面甭给我分,谁给我分我和谁急)回复于 2005-03-13 19:28:51 得分 0
你用的什么工程?我在控制台下面编译没有问题……Top
19 楼EnochShen(小疯子:真的好菜—知耻而后勇!)回复于 2005-03-13 19:30:12 得分 5
如果他一开始就初始化了,就不用了
for( i = 0; i < 10; i++)
{
part[i] = (char *)malloc(SUB_STRING_LENTH);
memset(part[i],0,SUB_STRING_LENTH);
}
Top
20 楼EnochShen(小疯子:真的好菜—知耻而后勇!)回复于 2005-03-13 19:31:01 得分 0
VC(别的我都不会用,惭愧的说^o^ )Top
21 楼heuristic(懵懂书童||十年面壁图破壁)回复于 2005-03-13 19:36:49 得分 0
呵呵 谢谢大家 !
我用的是gcc,刚才翻手册查strtok呢
欢迎继续讨论,结帖了Top
22 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-03-13 19:45:23 得分 0
malloc是堆上分配,不是局部变量Top




