質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

4回答

1190閲覧

回文のやり方(間違いを見つけてほしいです)

t-xxx5

総合スコア6

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/12/10 17:26

回文かどうかを判断するプログラムを作りたいのですが、思い通りに動作しなくて困っています。何度も考えたのですが、なぜできないのかわかりませんでした。もしよろしければ、間違いを訂正、指摘していただけると助かります。よろしくお願いします。

#include <stdio.h> int main(void){ int i=0, j=0, count=0, x=0; char s[256], t[256]; printf("単語を入力: "); scanf("%s", s); while(s[i++]!='\0'){ count++; } printf("count=%d\n", count); while(count != 0){ t[j] = s[count-1]; count--; j++; } for(i=0; i<count-1; i++){ if(s[i]==t[i]) x=1; else x=0; } printf("x=%d\n", x); if(x==1){ printf("原文: %s, 回文: %s\n", s, t); } else printf("回文ではありません\n"); return 0; }

実行結果

単語を入力: aba count=3 x=0 回文ではありません

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/12/10 23:09

思い通りに動かないとはどういうふうに動くんでしょうか そこらへん詳しく説明しよう
dodox86

2021/12/11 00:55

考えて分からなければ、デバッグして変数の値の移り変わりを確認するなどしましょう。分からなくなるたびに質問する訳にはいきませんね。
guest

回答4

0

質問のコードの間違いの指摘でなくて申し訳ありませんが、
反転した文字列を新たに作る必要はありません。
元の文字列の最後を見つけて、両端から順に比較するだけです。

C

1#include <stdio.h> 2 3int main(void) 4{ 5 char s[256]; 6 printf("単語を入力: "); 7 scanf("%s", s); 8 int i = 0, j = 0; 9 while (s[j]) j++; 10 while (i < --j && s[i] == s[j]) i++; 11 if (i < j) puts("回文ではありません"); 12 else puts("回文です"); 13}

投稿2021/12/11 02:06

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

あなたのソースに修正を加えました。
修正個所は以下の通りです。
1.countを減算しているので以降使えない為、count2にコピーし、以降count2を使うようにした。
2.tの終端がNULLになっていないので、印字するときに文字化けが発生するのを抑止するようにした。
(終端にNULLを付加)
3.文字の比較は、不一致が一か所でもあればNGなので、一致でx=1 不一致でx=0 を繰り返すと、
正しい結果にならない。(前が不一致でも、最後が一致していればx=1となってしまう為)
従って、最初にx=1をセットし、不一致があればx=0 としなければいけません。

C

1include <stdio.h> 2 3int main(void){ 4 5 int i=0, j=0, count=0, x=0; 6 int count2; //追加 7 char s[256], t[256]; 8 9 printf("単語を入力: "); 10 scanf("%s", s); 11 12 while(s[i++]!='\0'){ 13 count++; 14 } 15 16 printf("count=%d\n", count); 17 count2 = count; //追加 18 t[count] = '\0'; //追加 19 while(count != 0){ 20 t[j] = s[count-1]; 21 count--; 22 j++; 23 } 24 25 x=1; //追加 26 for(i=0; i<count2-1; i++){ //変更 27 if(s[i]!=t[i]) x=0; //変更 28 //else x=0; //削除 29 } 30 31 printf("x=%d\n", x); 32 33 if(x==1){ 34 printf("原文: %s, 回文: %s\n", s, t); 35 } 36 else printf("回文ではありません\n"); 37 38 return 0; 39} 40

投稿2021/12/11 00:44

tatsu99

総合スコア5438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C

1#include <stdio.h> 2#include <stdbool.h> 3 4int main(void){ 5 6 char original[256], reversed[256]; // 変数名は ぱっと見 で意味がわかるように 7 8 printf("単語を入力: "); 9 scanf("%s", original); 10 11 int length = 0; // 変数名は ぱっと見 で意味がわかるように 12 while( original[length] !='\0' ){ 13 length++; 14 } 15 16 printf("length=%d\n", length); 17 18 // 反転 19 for ( int i = 0; i < length; ++i ) { 20 reversed[i] = original[length-i-1]; 21 } 22 reversed[length]= '\0'; // 終端を忘れずに 23 24 // 回文か? 25 bool parindrome = true; // 変数名は ぱっと見 で意味がわかるように 26 for ( int i = 0; i < length; ++i ){ 27 // 一致しなかったら回文ではない。直ちにloopを抜ける。 28 if ( original[i] != reversed[i] ) { 29 parindrome = false; 30 break; 31 } 32 } 33 34 if ( parindrome ) { 35 printf("原文: %s, 回文: %s\n", original, reversed); 36 } else { 37 printf("回文ではありません\n"); 38 } 39 40 return 0; 41}

投稿2021/12/11 00:02

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

最初の while ループで count 変数の値が 0 になってしまいますので、次の for ループは一度も実行されません。つまり、x の値は常に 0 です。

c

1 while(count != 0){ 2 t[j] = s[count-1]; 3 count--; 4 j++; 5 } 6 7 for(i=0; i<count-1; i++){ 8 if(s[i]==t[i]) x=1; 9 else x=0; 10 }

その他、t が null terminate されていません。

投稿2021/12/10 18:59

編集2021/12/10 19:00
melian

総合スコア19714

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問