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]にアクセスし、文字列の末尾から現在の要素にアクセスするために使用します。との 2 つのポインターを作成pbpe、それらを互いに近づけることができます。

ポインターを定義するには、これを使用します。

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

ポインタを互いに向かって進めるには、 と を使用pb++pe--ます。ポインターが互いに交差していないかどうかを確認するには、それを確認しpb < peます。現在、プログラムは文字列を 2 回チェックしています。それを行う必要はありません -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

with 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

質問を完全に理解しているかどうかはわかりませんが、これで答えられると思います。あなたは実際に文字ポインタを使用しています。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 に答える