很简单的一个程序,遇到了些小麻烦。希望能有人看一下解决办法

很简单的一个程序,遇到了些小麻烦。希望能有人看一下
/*==============================================================================================
name:   判断一个字符串是否为回文字符串

description:

正读和反读都一样的字符串称为回文字符串,在键盘上输入一个字符串,判别它是否是回文字符串。一个回文
字符串一定是对称的(关于中心对称。当字符数位奇数个则以中心一个字符为轴,偶数个时中间两个字符相同)
我的想法是:
首先正序读入要判断的字符串字符串的前1/2字符串,然后再按倒序的方式读入该字符串的后一半。最后比较两
个字符串是否相等.若相等则返回一个为true的boolean值,该字符串是回文(Palindrome)  


bugs:

可能是movmem()函数我不会使用,调试的时候发现使用该函数不能截取字符串的前n个字符,并且好像printf函数输出显示不太正常(和debug断点监视变量的值不同),有时候结果能够正确。
===============================================================================================*/


#include <conio.h>
#include <stdio.h>
#include <string.h>
#include   <math.h>

#define   TRUE   1
#define   FALSE   0

typedef   int   boolean;


void   input_str(char*   str)
{
scanf( "%s ",str);
}

char*   reverse(char*   src,int   n)
{
char*     str_tmp= " ";
int   i;

if(n> strlen(src))   n   =   strlen(src);

for(i=0;(n-1-i)> =0;i++)
{
str_tmp[i]   =   src[n-1-i];
}
str_tmp[n]= '\0 ';
return(str_tmp);

}


boolean   IsPalindrome(char*   src)
{
char*   str_former= " ";
char*   str_latter= " ";
double   i;
i=ceil(strlen(src)/2);
str_former   =   movmem(str_former,src,ceil(strlen(src)/2.0));
str_latter   =   reverse(src,ceil(strlen(src)/2.0));

if(!strcmp(str_former,str_latter))
return   (TRUE);
else
return   (FALSE);


}

void   main()
{
char*   string;

/*input   the   string*/

clrscr();
input_str(string);


/*compute   and   output   the   answer*/

if(IsPalindrome(string))
printf( "YES!\n ");
else
printf( "NO!\n ");

}


------解决方案--------------------
很明显的一个问题:你的所有的字符串存放的位置都是未知的!
在main里面,original_str和reverse_str都仅是指针,如果你不开出一段内存给它们(malloc或new),它们都是未初始化的,指向一个不可知的地方,而不是你所认为的一个字符串!
把reverse_str和original_str改为char original_str[MAXLONG],reverse_str[MAXLONG];
其他涉及到字符串,指针的地方也修改一下,再看看你程序的运行结果吧
------解决方案--------------------
对你的reverse进行的改写:
#include <string.h>
#include <conio.h>
#include <stdio.h>

char* str_reverse(char* src,char* des,int n)
{
//char* str_tmp= " ";
int i;

if(n> (signed)strlen(src)) n = strlen(src);

for(i=0;(n-1-i)> =0;i++)
{
des[i] = src[n-1-i];
}
des[n]= '\0 ';
return(des);

}


main ()
{
char original_str[128];
char reverse_str[128];

clrscr();
scanf( "%s ",original_str);
//reverse_str = str_reverse(original_str,reverse_str,strlen(original_str));
str_reverse(original_str,reverse_str,strlen(original_str));
clrscr();
printf( "original: %s\n ",original_str);
printf( "reversed: %s\n ",reverse_str);
}
------解决方案--------------------
另外一点,我个人的习惯,对于字符串,一个就是一个,不可能有几点几个,如果出现非整形类型double或float类型来操作字符串,很可能出现问题,毕竟浮点到整形的隐式转换很危险哈~
i=ceil(strlen(src)/2);
str_former = movmem(str_former,src,ceil(strlen(src)/2.0));