fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. // myStrlen関数
  5. int myStrlen(char s[]) {
  6. int i = 0;
  7. while (s[i] != '\0') {
  8. i++;
  9. }
  10. return i;
  11. }
  12.  
  13. // 回文を作成する関数
  14. char *setPalindrome(char s[]) {
  15. int m = myStrlen(s);
  16. int i, j;
  17.  
  18. // 回文を作るために、最大で何文字一致するかを探す
  19. for (i = 0; i < m; i++) {
  20. // 前半部分 s[0:i] と後半部分 s[m-i:m] が一致するかを確認
  21. int match = 1;
  22. for (j = 0; j < m - i; j++) {
  23. if (s[j] != s[m - 1 - j]) {
  24. match = 0;
  25. break;
  26. }
  27. }
  28.  
  29. // 完全に一致した場合
  30. if (match) {
  31. break;
  32. }
  33. }
  34.  
  35. // 必要なメモリを確保
  36. char *tmp = (char *)malloc(sizeof(char) * (2 * m - i + 1));
  37. if (tmp == NULL) {
  38. printf("ERROR\n");
  39. return NULL;
  40. }
  41.  
  42. // 回文の前半部分をそのままコピー
  43. for (j = 0; j < m - i; j++) {
  44. tmp[j] = s[j];
  45. }
  46.  
  47. // 逆順で残りの部分を追加
  48. for (j = 0; j < i; j++) {
  49. tmp[m - i + j] = s[m - 1 - j];
  50. }
  51.  
  52. tmp[2 * m - i] = '\0'; // 終端文字を追加
  53.  
  54. return tmp;
  55. }
  56.  
  57. // メイン関数
  58. int main() {
  59. char nyuryoku[1024]; // 入力用バッファ
  60. char *kaibun; // 回文を受け取るポインタ
  61. scanf("%s", nyuryoku); // 入力を受け取る
  62.  
  63. kaibun = setPalindrome(nyuryoku); // 回文を生成
  64. if (kaibun != NULL) {
  65. printf("%s\n -> %s\n", nyuryoku, kaibun);
  66. free(kaibun); // 動的に確保したメモリを解放
  67. }
  68.  
  69. return 0;
  70. }
  71.  
Success #stdin #stdout 0s 5280KB
stdin
abab
stdout
abab
  -> baba