首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2012-02-17 
很简单的一个程序,遇到了些小麻烦。希望能有人看一下/*

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


str_latter = reverse(src,ceil(strlen(src)/2.0));
不要这样操作哈~
字符串个数不是奇数就是偶数,如果你不想理奇数中间那个,就直接i=strlen(src)/2就ok了,如果要算上那个,就i=strlen(src)/2 + (strlen(src)%2?1:0);就好了哈~
[解决办法]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int IsPalindrome(char* b);

int main()
{
char a[20];
printf( "please input a string\n ");
scanf( "%s ",a);
if(IsPalindrome(a))
printf( "yes ");
else
printf( "no ");

}

int IsPalindrome(char* b)
{
int max,min;
min = 0;
max = strlen(b)-1;
while (min <=max)
{
if (b[min]!=b[max])
{
return 0;
}
min++;
max--;
}
return 1;
}

热点排行