ああ!アルゴリズム:復号文

8825 ワード

原書の読み取り文字列はgets()を使用しており、この関数を使用して文字列を読み取るのは危険なため、fgets()の代わりに変更され、修正後のコードは以下の通りです.
 1 #include <stdio.h>

 2 #include <string.h>

 3 

 4 int main(void)

 5 {

 6     char str[100], stack[100];

 7     int  i, len, mid, next, top;

 8 

 9     fgets(str, sizeof(str), stdin);

10     len = strlen(str);//including '
'
11 mid = len / 2 - 1;// 12 13 top = 0;// 14 for (i = 0; i <= mid; i++){// mid 15 stack[++top] = str[i]; 16 } 17 18 // 19 next = (len % 2) ? (mid+2) : (mid+1); 20 21 // 22 for (i = next; i <= len - 1; i++){ 23 if (str[i] != stack[top]) break; 24 top--; 25 } 26 27 // 28 if (top == 0) 29 printf("YES
"); 30 else 31 printf("No
"); 32 33 return 0; 34 }

gets()とfgets()の違いは、私のもう一つの文章「文字列読み出しの問題」を参照してください.ただ、入力文字列はリダイレクトを採用してください.手動で入力して車に戻るとstrlen()が実際の長さより1大きくなります.改行文字が多く読み込まれているためです.
もちろん、この問題をこんなに複雑にする必要はありません.文字列は1つの文字配列に格納されているので、文字列の長さを知っている場合は、2つのポインタを通じて、1つは最初の文字を指し、もう1つは最後の文字を指し、両者が等しいかどうかを比較することができます.等しい場合、2つのポインタは同時に中間に1つの要素を移動し、次の比較を行います.待たない場合は、比較が終了し、その文字列が返信文字列ではないことを示します.ポインタが中間位置に移動するまで等しくない場合は、その文字列が返信文字列であることを示します.コードは次のとおりです.
 1 #include <stdio.h>

 2 #include <string.h>

 3 

 4 int isHuiWen(char s[], int len){

 5     int i, mid = len / 2;//   mid       

 6 

 7     for (i = 0; i < mid; i++){

 8         if (s[i] == s[len - i - 1])continue;

 9         else return 0;

10     }

11     return 1;

12 }

13 

14 int main(void)

15 {

16     char str[100];

17     int  len;

18 

19     fgets(str, sizeof(str), stdin);

20     len = strlen(str);

21     printf("%s of size %d
", str, len); 22 23 if (isHuiWen(str, len)){ 24 printf("YES
"); 25 }else{ 26 printf("No
"); 27 } 28 29 return 0; 30 }