3

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

#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

4 回答 4

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
于 2013-09-18T14:18:22.113 回答
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'
于 2013-09-18T14:26:12.360 回答
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;
}
于 2013-09-18T19:58:14.733 回答
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?

这似乎更容易(我是初学者,所以如果我错了请纠正我)

于 2013-12-05T15:18:15.560 回答