字符指针与C中的回文检查器

时间:2013-09-18 14:11:04

标签: c string pointers char palindrome

这是我编写的代码,用于检查字符串是否为回文序列。我需要修改这段代码,以便它在其中使用字符指针。有人可以给我一些建议/提示......或者告诉我该怎么做?感谢

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(){
    char string1[20];
    int i, length;
    int flag = 0;
    printf("Enter a string: ");
    scanf("%s", string1);
    length = strlen(string1);
    for(i=0;i < length ;i++){
        if(toupper(string1[i]) != toupper(string1[length-i-1])){
            flag = 1;
            break;
        }
    }
    if (flag) 
        printf("%s is not a palindrome \n\n", string1); 
    else 
        printf("%s is a palindrome \n", string1);

    return 0;
}

4 个答案:

答案 0 :(得分:2)

在您的代码中,您使用string1[i]从字符串的开头访问当前元素,使用string1[length-i-1]从字符串末尾访问当前元素。您可以创建两个指针pbpe,然后将它们朝向彼此移动。

要定义指针,请使用:

char *pb = &string1[0]; // Or just string1, compiler will convert it to pointer
char *pe = &string1[length-1];

要将指针推向对方,请使用pb++pe--。 要查看指针是否相互交叉,请检查pb < pe。目前,您的程序检查字符串两次;没有必要这样做 - 只要pe小于或等于pb,您就可以停止。 要访问当前指针指向的字符,请使用

toupper(*pb) != toupper(*pe)

您可以将检查与推进指针相结合,如下所示:

toupper(*pb++) != toupper(*pe--)

注意:使用%s是不安全的,因为当用户输入的字符多于您在string1缓冲区溢出结果中的字符数时。您应该指定缓冲区的长度,如下所示:

scanf("%19s", string1); // Leave one char for null terminator

答案 1 :(得分:0)

我不确定我是否完全理解这个问题,但我认为这可以解决这个问题。你实际上是在使用字符指针。 char string1 [20]与char * string1相同。不同之处在于您基本上已将指针指向一块内存。你可以用这种方式访问​​字符串。

char string[20] = "foo";

printf("%c\n", string[0]);  // will print 'f'
printf("%c\n", *string); // will also print 'f'

printf("%c\n", string[1]); // will print the first 'o'
printf("%c\n", *(string + 1)); // will also print the first 'o'

答案 2 :(得分:0)

使用char *就像这样

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main()
{
    char string1[20];
    int i, length;
    int flag = 0;
    printf("Enter a string: ");
    scanf("%s", string1);
    length = strlen(string1);

    char *start=string1;
    char *end=&string1[length-1];

    //only check upto half


    for(i=0;i <= (length-1)/2 ;i++)
    {
        if(toupper(*(start+i)) != toupper(*(end-i)))
        {
            flag = 1;
            break;
        }
    }
    if (flag) 
        printf("%s is not a palindrome \n\n", string1); 
    else 
        printf("%s is a palindrome \n", string1);

    return 0;
}

答案 3 :(得分:0)

我们只是将原始字符串复制到另一个数组,然后使用strrev()来反转复制的字符串,然后最后将原始字符串与反向字符串进行比较?

喜欢这个

1.get new string 
2.copy string to new array 
3.reverse the copied string using strrev 
4.use strcmp to check if both are same or not?
这似乎更容易 (我是初学者,所以如果我错了请纠正我)