簡體   English   中英

字符指針與C中的回文檢查器

[英]Character Pointers with Palindrome Checker in C

這是我寫的代碼,用於檢查字符串是否是回文。 我需要修改這段代碼,以便它在其中使用字符指針。 有人可以給我一些建議/提示......或者告訴我該怎么做? 謝謝

#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;
}

在您的代碼中,您使用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是不安全%s ,因為當用戶在string1緩沖區溢出結果中輸入的字符多於擬合時。 您應該指定緩沖區的長度,如下所示:

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

我不確定我是否完全理解這個問題,但我認為這可以解決這個問題。 你實際上是在使用字符指針。 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'

與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;
}

我們只是將原始字符串復制到另一個數組,然后使用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?

這似乎更容易(我是一個初學者所以如果我錯了請糾正我)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM