| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1132 人关注过本帖
标题:测试回文,感觉写的好复杂
只看楼主 加入收藏
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
结帖率:95.65%
收藏
已结贴  问题点数:20 回复次数:16 
测试回文,感觉写的好复杂
main() 用来测试的,不用去管。

程序代码:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>


int
palindrome( char *string );

int
main( void )
{
    char s1[10000];
    int i;
    int ch;
    FILE *fp;

    if( NULL == ( fp = fopen( "word.txt","r" ) ) )
    {
        fprintf( stderr, "Error\n" );
        exit( EXIT_FAILURE );
    }

    for( i = 0; 10000 - 1 > i && EOF != ( ch = fgetc( fp ) ); i++ )
        s1[ i ] = ch;
    s1[ i ] = '\0';

    while( 'y' == ( ch = getchar() ) )
    {
        while( '\n' != getchar() )
            ;
        if( 1 == ( i = palindrome( s1 ) ) )
            printf( "Yes\n" );
        else if( -1 == i )
            printf( "Error\n" );
        else
            printf( "No\n" );
    }

    fclose( fp );

    getchar();

    return 0;
}


void
reverse( char *src );
enum { Error = -1, No = 0, Yes = 1};


int
palindrome( char *string )
{
    char *s1, *s2;
    char temp[ strlen( string ) ];//VS或VC这一行可能通不过编译。
    int CharAmount;
    int Limit;
    int i;


    if( 0 ==  strlen( string ) )
        return Error;


    for( CharAmount = 0, i = 0; '\0' != *string; string++ )
        if( isalpha( *string ) )
        {
            temp[ i++ ] = tolower( *string );
            CharAmount++;
        }
    temp[ i ] ='\0';


    Limit = CharAmount / 2;
    s1 = ( char * )malloc( ( Limit + 1 ) * sizeof( char ) );
    s2 = ( char * )malloc( ( Limit + 1 ) * sizeof( char ) );
    if( NULL == s1 || NULL == s2 )
        return Error;


    strncpy( s1, temp, Limit );
    *( s1 + Limit ) = '\0';

    if( CharAmount % 2)
        strncpy( s2, temp + Limit + 1, Limit );
    else
        strncpy( s2, temp + Limit, Limit );
    *( s2 + Limit ) = '\0';
    reverse( s2 );

    i = strcmp( s1, s2 );
    free( s1 );
    free( s2 );

    if( 0 == i )
        return Yes;
    else
        return No;
}


void
reverse( char *src )
{
    char *s1, *s2;
    char temp;

    s1 = src;
    s2 = src;

    while( '\0' != *s2 )
        s2++;
    s2--;

    for( ; s1 < s2; s1++, s2-- )
    {
        temp = *s1;
        *s1 = *s2;
        *s2 = temp;
    }
}


[此贴子已经被作者于2017-3-13 15:41编辑过]

2017-03-13 15:35
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:7 
给你一个测试回文的例子:
#include <stdio.h>
#include <stdlib.h>
int palind(char str[],int k,int i)
{
    if (str[k] == str[i - k] && k == 0)
        return 1;
    else if (str[k] == str[i - k])
        palind(str, k - 1, i);
    else
        return 0;
}
void main()
{   
    int i = 0, n = 0;
    char ch, str[20];
    while ((ch = getchar()) != '\n')
    {
        str[i] = ch;
        i++;
    }
    if (i % 2 == 0)
    {
        n = palind(str, (i / 2), i - 1);
    }
    else
    {
        n = palind(str, (i / 2 - 1), i - 1);
    }
    if (n == 0)
    {
        printf("不是回文字符串");
    }
    else
    {
        printf("是回文字符串");
    }
    system("pause");
}
2017-03-13 16:23
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:7 
回复 2楼 ehszt
如果字符串太长~ 不适宜用递归~因为要考虑栈空间溢出问题~

当然上楼把数组空间只开20那就可以~但像楼主那样开大空间就不建议用递归了~

[此贴子已经被作者于2017-3-13 16:30编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-13 16:28
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:7 
首尾指针向中间移动比对
2017-03-13 16:33
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 2楼 ehszt
用你的代码考虑下:Madam, I'm Adam

PS:写代码能不能标准点儿。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-13 16:36
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 4楼 吹水佬
考虑下我回复2楼的那个字符串。那是最经典的回文,用二楼的代码无法判断。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-13 16:36
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 3楼 九转星河
我写的那个main()是用来测试的,不用在意。
那个while我自己拿来看有没有内存泄漏。

但是的确有一点,没有人可以判断用户将输入多少个字符。

[此贴子已经被作者于2017-3-13 16:46编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-13 16:41
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
回复 6楼 renkejun1942
你是说大小写都一样,逗号和单引号也一样?
2017-03-13 16:41
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 8楼 ehszt
回文本来就是这样的啊,忽略标点,忽略大小写。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-13 16:43
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
以下是引用九转星河在2017-3-13 16:28:01的发言:

如果字符串太长~ 不适宜用递归~因为要考虑栈空间溢出问题~

当然上楼把数组空间只开20那就可以~但像楼主那样开大空间就不建议用递归了~

数组长了为什么会栈溢出?不用递归用循环行不行?不大懂。
2017-03-13 16:45
快速回复:测试回文,感觉写的好复杂
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018303 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved