A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

代码如下,输出是否是回文的那个题,自己琢磨了很久墨迹出这么个玩意来,运行后结果不对,偏偏还找不到问题,请各路大神帮帮忙~~感激不尽!!
  1. /*
  2. 编写一个函数,判断某个字符串是否为回文。
  3. 回文就是从左边开始读 和 从右边开始读 都是一样的,比如"abcba"
  4. */

  5. #include <stdio.h>
  6. #include <string.h>

  7. int test(char *s);

  8. int main()
  9. {
  10.    
  11.     char a[20];
  12.     printf("请输入字符串:\n");
  13.     scanf("%s",a);
  14.    
  15.     if (test(a))
  16.         printf("这段字符串为回文\n");
  17.     else
  18.         printf("这段字符串不是回文\n");
  19.     /*
  20.     int t=strlen(a);
  21.     printf("%d\n",t);
  22.     */
  23.    
  24.     return 0;
  25.    
  26. }

  27. int test(char *s)
  28. {
  29.     int i=1,j=0,size=strlen(s);
  30.     for (; j<size/2; j++)
  31.     {
  32.         if (*s==s[size-i])
  33.         {
  34.             s++;
  35.             i++;
  36.         }
  37.         else
  38.             break;
  39.     }
  40.     if (j==size/2)
  41.         return 1;
  42.     else
  43.         return 0;

  44. }
复制代码

评分

参与人数 1黑马币 +1 收起 理由
星河鹭起 + 1

查看全部评分

17 个回复

正序浏览
决定明天也开始投入这种无休止的代码行列!
回复 使用道具 举报
彈指っ紅顏老 发表于 2014-11-22 11:52
我的注释也写出来了,麻烦帮我看一下吧~感激不尽~~

int test(char *s)
{
    int j=0;//定义一个计数器
   
    int size=strlen(s)/2;//size是若全部相同应该对比的总次数
   
    for (; j<size; j++)
    {
        if (*s==s[--size])//当j<size,判断前后两个对应字符是否相同
        {
            s++;//相同则s自增
        }
        else
            break;//不同则退出循环
    }
    if (j==size)
        return 1;//判断若前后字符全部对比了一遍则表示全部相同
    else
        return 0;//否则就不是回文

}
第9行的S[--size],这个s[--size]已经取不到最后的几个字符了,前面已经size = strlen(s)/2.
可以把第7行 j<size 改成 j <  strlen(s)/2,同理16行。
回复 使用道具 举报
  1. /*
  2. 编写一个函数,判断某个字符串是否为回文。
  3. 回文就是从左边开始读 和 从右边开始读 都是一样的,比如"abcba"
  4. */

  5. #include <stdio.h>
  6. #include <string.h>

  7. int test(char *s);

  8. int main()
  9. {
  10.    
  11.     char a[20];
  12.     printf("请输入字符串:\n");
  13.     scanf("%s",a);
  14.    
  15.     if (test(a))
  16.         printf("这段字符串为回文\n");
  17.     else
  18.         printf("这段字符串不是回文\n");
  19.     /*
  20.      int t=strlen(a);
  21.      printf("%d\n",t);
  22.      */
  23.    
  24.     return 0;
  25.    
  26. }

  27. int test(char *s)
  28. {
  29.     int i=1,j=0,size = strlen(s);
  30.     for (; j<size/2; j++)
  31.     {
  32.         if (s[j]!=s[size-i])
  33.         {
  34.             return 0;
  35.         }
  36.              i++;
  37.     }
  38.             return 1;

  39. }
复制代码


这是我在你原有的基础上修改的,你函数判断那段代码我也有点不懂,所以直接修改了一下!
回复 使用道具 举报
依米阳光 发表于 2014-11-22 11:29
你上面说的三种情况都属于回文串的例子,你的代码可能在逻辑上出现了问题,思路没错。论坛里面的大神很多 ...

我的注释也写出来了,麻烦帮我看一下吧~感激不尽~~
  1. int test(char *s)
  2. {
  3.     int j=0;//定义一个计数器
  4.    
  5.     int size=strlen(s)/2;//size是若全部相同应该对比的总次数
  6.    
  7.     for (; j<size; j++)
  8.     {
  9.         if (*s==s[--size])//当j<size,判断前后两个对应字符是否相同
  10.         {
  11.             s++;//相同则s自增
  12.         }
  13.         else
  14.             break;//不同则退出循环
  15.     }
  16.     if (j==size)
  17.         return 1;//判断若前后字符全部对比了一遍则表示全部相同
  18.     else
  19.         return 0;//否则就不是回文

  20. }
复制代码
回复 使用道具 举报
mahei521 发表于 2014-11-22 09:14
#include
#include
int main()

strcmp是string.h里面的函数吗- -把a赋给b是什么意思啊……麻烦还是先帮我找一下我的错误吧~非常感谢~
  1. int test(char *s)
  2. {
  3.     int j=0;//定义一个计数器
  4.    
  5.     int size=strlen(s)/2;//size是若全部相同应该对比的总次数
  6.    
  7.     for (; j<size; j++)
  8.     {
  9.         if (*s==s[--size])//当j<size,判断前后两个对应字符是否相同
  10.         {
  11.             s++;//相同则s自增
  12.         }
  13.         else
  14.             break;//不同则退出循环
  15.     }
  16.     if (j==size)
  17.         return 1;//判断若前后字符全部对比了一遍则表示全部相同
  18.     else
  19.         return 0;//否则就不是回文

  20. }
复制代码
回复 使用道具 举报
weizhang00 发表于 2014-11-22 02:37
有时候思路不同看别人的代码好痛苦,还的猜你怎么想的

这个是我函数的思路,你帮我看一下~
  1. int test(char *s)
  2. {
  3.     int j=0;//定义一个计数器
  4.    
  5.     int size=strlen(s)/2;//size是若全部相同应该对比的总次数
  6.    
  7.     for (; j<size; j++)
  8.     {
  9.         if (*s==s[--size])//当j<size,判断前后两个对应字符是否相同
  10.         {
  11.             s++;//相同则s自增
  12.         }
  13.         else
  14.             break;//不同则退出循环
  15.     }
  16.     if (j==size)
  17.         return 1;//判断若前后字符全部对比了一遍则表示全部相同
  18.     else
  19.         return 0;//否则就不是回文

  20. }
复制代码
回复 使用道具 举报
彈指っ紅顏老 发表于 2014-11-22 11:24
这个题我确实是想复杂了,看看老师的代码我就想撞死了……不过我的理解是asa是回文但是assa不也是回文吗 ...

你上面说的三种情况都属于回文串的例子,你的代码可能在逻辑上出现了问题,思路没错。论坛里面的大神很多一起学习···
回复 使用道具 举报
weizhang00 发表于 2014-11-22 02:35
我不清楚你的思路是什么,居然拿j ==size/2 的长度数值作为回文的依据
正常的思路不应该是两头比较,不 ...

你等等哈,我去把注释写写贴上来……我最郁闷的是看不出错在什么地方……
回复 使用道具 举报
依米阳光 发表于 2014-11-22 02:51
对于这道题感觉你的思路有点复杂,1,判断字符数组的长度是否为奇数,如果不是直接打印不是回文串,如果是 ...

这个题我确实是想复杂了,看看老师的代码我就想撞死了……不过我的理解是asa是回文但是assa不也是回文吗?甚至ssss难道不能算回文吗~而且按照我的理解我就是那么对比的啊……
回复 使用道具 举报
#include<stdio.h>
#include<string.h>
int main()
{
        char a[50];
        char b[50];
        int i,n,j=0;
        printf("请输入字符串");
        gets(a);
        n=strlen(a);
        for(i=n-1;i>=0;i--)
        {
                b[j]=a[i];
                j++;
                        }
        if(strcmp(a,b)==0)
        {
                printf("是回文\n");
        }
        else
        {
                printf("不是回文\n");
        }
        return 0;
}
这是通过系统字符串函数比较回文的方法,比较简单!
回复 使用道具 举报
邵起 中级黑马 2014-11-22 08:32:41
8#
思路不难,关键是对代格式的理解。
回复 使用道具 举报
这个难道不属于回文串的定义麽?
回复 使用道具 举报
依米阳光 发表于 2014-11-22 02:51
对于这道题感觉你的思路有点复杂,1,判断字符数组的长度是否为奇数,如果不是直接打印不是回文串,如果是 ...

关于数组长度你想错了,如果我输入zzz呢?
回复 使用道具 举报 1 0
对于这道题感觉你的思路有点复杂,1,判断字符数组的长度是否为奇数,如果不是直接打印不是回文串,如果是取数组长度的一半,n然后for循环n次拿数组第一个与最后一个对比,第二个与倒数第二个对比,n对对比如果都相同就是回文串否则不是。手机回复请谅解...)
回复 使用道具 举报 3 0
  1. int test(char *s)
  2. {
  3.     int i = 0;
  4.     int j = strlen(s)-1;
  5.     for (; i < j /2; i++) {
  6.         if (s[i]!=s[j-i*1]) {
  7.             return 0;
  8.         }
  9.     }
  10.     return 1;
  11. }
复制代码

给你写了一个,我用的我的思路,你的思路我不能理解
回复 使用道具 举报
有时候思路不同看别人的代码好痛苦,还的猜你怎么想的
回复 使用道具 举报
我不清楚你的思路是什么,居然拿j ==size/2 的长度数值作为回文的依据
正常的思路不应该是两头比较,不相等就不是回文么
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马