-1

文字列が回文かどうかをチェックする基本的なプログラムをコーディングしています。

#include <stdio.h>
#include <string.h>             //Has some very useful functions for strings. 
#include <ctype.h>              //Can sort between alphanumeric, punctuation, etc.

int main(void)
{

char a[100];
char b[100];                            //Two strings, each with 100 characters. 

int firstchar;
int midchar;
int lastchar;

int length = 0;
int counter = 0;

printf(" Enter a phrase or word for palindrome checking: \n \n ");

    while ((a[length] == getchar())  !10 )      //Scanning for input ends if the user presses enter. 
    {
        if ((a[length -1]), isalpha)                // If a character isalpha, keep it. 
        {
            b[counter] = a[length-1];
            counter++;
        }

    length--;           //Decrement. 
    }

makelower(b, counter);                      //Calls the function that changes uppercase to lowercase. 


for( firstchar = 0; firstchar < midchar; firstchar++ )  //Compares the first and last characters. 
    {
    if ( a[firstchar] != a[lastchar] )
        {
            printf(", is not a palindrome. \n \n");
            break;
        }
    lastchar--;
    }   

if( firstchar == midchar ) 
    {
        printf(", is a palindrome. \n \n");
    }


return 0;
}


//Declaring additional function "makelower" to change everything remaining to lowercase chars. 


int makelower (char c[100], int minicount)
{
    int count = 0;
    while (count <= minicount)
    {
        c[count] = tolower(c[count]);
    }
return 0;
}

そして、printf ステートメントの直後の最初の while ループのある行で、次のコンパイラ エラーが発生します。

p5.c: In function 'main':
p5.c:30: error: expected ')' before '!' token

上下を調べましたが、場違いな括弧や提携していない括弧は見つかりませんでした。私が考えることができる唯一のことは、コンマまたはある種の句読点が欠けているということですが、いくつかの場所にコンマを配置しようとしましたが、役に立ちませんでした.

これが具体的すぎる場合は申し訳ありません。前もって感謝します。

4

1 に答える 1

3
while ((a[length] == getchar())  !10 )

あなたがしようとしているように見えるのはa[length]、 の結果に代入し、getchar()それが と等しくないことを確認することです10。次のように綴られています。

while ((a[length] = getchar()) != 10) 

=課題、==テストです。

さらに、あなたのカウンターは混乱しています。 lengthに初期化され0、デクリメントされるだけです。これにより、最初のデクリメントの後に配列の前面から落ちることにつながります。にアクセスしようとしてa[length-1]も失敗するため、これが発生する可能性はありません。これは、 getchar() から読み取ったばかりの文字にアクセスする際の、 フェンスポスト エラーとも呼ばれるoff-by-one エラー のように見えます。

また、記録された入力の長さが buffer の長さを超えていないことを何もチェックしていないためa[100]、そこでも終了する可能性があります。

回文チェック機能のカウンターもオフです。 初期化midcharも設定もされず、値が設定されることなくデクリメントされます。おそらく、テストしたほうがよいでしょう。lastcharmidcharlastchara[firstchar] == a[(counter-1)-firstchar]

于 2013-05-09T22:35:19.750 に答える