字符串发转问题

liujiaji 2010-08-31 08:48:15
#include "stdafx.h"
#include "string.h"
#include "malloc.h"

int _tmain(int argc, _TCHAR* argv[])
{
size_t len = 0;
char str[128] = "";
char *des = NULL;
char *tmp = NULL;

scanf("%s",str);
len = strlen(str);
tmp = (char *)malloc(sizeof(char)*len);
memset(tmp,'\0',strlen(tmp));

des = tmp;

for (int i = 1; i <= len; i++)
{
*tmp = *(str+len-i);
tmp++;
}
strcpy(str,des);

if ( des != NULL )
{
free(des);
}
tmp = des = NULL;

getchar();

return 0;
}

为啥一运行到free(des)就出错?
...全文
182 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
liujiaji 2010-08-31
  • 打赏
  • 举报
回复
tmp = (char *)malloc(sizeof(char)*(len + 1) );
memset(tmp,'\0',len+1);

改了这样就好了,为啥?
liujiaji 2010-08-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fengrider 的回复:]

memset(tmp,'\0',strlen(tmp));
楼主,请注意下这里。
[/Quote]

就是这个原因?为啥啊?
miss味道 2010-08-31
  • 打赏
  • 举报
回复




int len = 0;
char str[128] = "";
char *des = NULL;
char *tmp;

scanf("%s",str);

len = strlen(str);
tmp = (char *)malloc(sizeof(char)*len);
int l=strlen(tmp);//

des = tmp;

memset(des,'\0',len);//ZeroMemory(des,len);



for (int i = 1; i <= len; i++)
{
*des = *(str+len-i);
des++;
}
memcpy(str,tmp,len);

if ( tmp != NULL )
{
free(tmp);
}

tmp = des = NULL;
getchar();
return 0;








好了,现在倒序不会有问题了了

miss味道 2010-08-31
  • 打赏
  • 举报
回复

size_t len = 0;
char str[128] = "";
char *des = NULL;
char *tmp = NULL;

scanf("%s",str);
strcpy(str,"dfdf");
len = strlen(str);
tmp = (char *)malloc(sizeof(char)*len); //tmp为作为保留起始指针,后面free(tmp)
des = tmp;//操作里面的值,用des
//到这不知道怎么搞的,竟然度为16 = strlen(tmp);
ZeroMemory(des,len);


for (int i = 1; i <= len; i++)
{
*des = *(str+len-i);
des++;
}

strcpy(str,tmp);

if ( tmp != NULL )
{
free(tmp);
}

tmp = des = NULL;







上面可以满期足LZ的需要,只是malloc tmp长度时,tmp长度会变长,不知道为什么,希望能有高手指点
youdaping777 2010-08-31
  • 打赏
  • 举报
回复
要考虑内存分配的问题,楼主#1说的不错。
FengRider 2010-08-31
  • 打赏
  • 举报
回复
memset(tmp,'\0',strlen(tmp));
楼主,请注意下这里。
bingshanzhiling 2010-08-31
  • 打赏
  • 举报
回复
额,好吧。。。没有看出问题来。。
we_sky2008 2010-08-31
  • 打赏
  • 举报
回复
其实不必动态分配内存的:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

char *reverse(char src[])
{
char *ret = src;
char *end = src;

if (src == NULL)
return NULL;

end += strlen(src);
while(src < --end)
{
char ch = *src;
*src = *end;
*end = ch;
++src;
}
return ret;
}

int main()
{
char src[128];

printf("Input a string\n");
gets(src);
printf("\n%s\n", reverse(src));

system("pause");
return 0;
}
ToT_God 2010-08-31
  • 打赏
  • 举报
回复
同意楼上的,接分
huzhibin2000 2010-08-31
  • 打赏
  • 举报
回复
tmp = (char *)malloc(sizeof(char)*len);
memset(tmp,'\0',strlen(tmp));

要改为:
tmp = (char *)malloc(sizeof(char)*(len + 1));

memset(tmp,'\0', len + 1);

你的代码会导致莫名奇妙的问题,不能对刚分配的未初始化的内存进行strlen的。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧