很简单的一个程序,遇到了些小麻烦。希望能有人看一下解决办法
很简单的一个程序,遇到了些小麻烦。希望能有人看一下
/*==============================================================================================
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));
/*==============================================================================================
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));