ああ!アルゴリズム:復号文
8825 ワード
原書の読み取り文字列はgets()を使用しており、この関数を使用して文字列を読み取るのは危険なため、fgets()の代わりに変更され、修正後のコードは以下の通りです.
gets()とfgets()の違いは、私のもう一つの文章「文字列読み出しの問題」を参照してください.ただ、入力文字列はリダイレクトを採用してください.手動で入力して車に戻るとstrlen()が実際の長さより1大きくなります.改行文字が多く読み込まれているためです.
もちろん、この問題をこんなに複雑にする必要はありません.文字列は1つの文字配列に格納されているので、文字列の長さを知っている場合は、2つのポインタを通じて、1つは最初の文字を指し、もう1つは最後の文字を指し、両者が等しいかどうかを比較することができます.等しい場合、2つのポインタは同時に中間に1つの要素を移動し、次の比較を行います.待たない場合は、比較が終了し、その文字列が返信文字列ではないことを示します.ポインタが中間位置に移動するまで等しくない場合は、その文字列が返信文字列であることを示します.コードは次のとおりです.
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 }