C言語で回文(日本語の文字列)の表示と判定を行うプログラミングを立てたのですが、上手く動きません。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
arare0304

C言語で回文(日本語の文字列)の表示と判定を行うプログラミングを立てたのですが、上手く動きません。

#1

投稿記事 by arare0304 » 10年前

C言語で回文(日本語の文字列)の表示と判定を行うプログラミングを立てたのですが、上手く動きません。
沢山あると思いますが、訂正していただきたいです。よろしくお願いします。

#include<stdio.h>
#include<string.h>

int main()
{
char moto [100];
char gyaku[100];


puts(“回文かどうかの判定をします。文字を日本語で入力してください。”);
gets(moto); 



int i;
for(i=strlen(moto)-2; i≧0; i-=2){
gyaku[strlen(moto)--i]=moto;
gyaku[strlen(moto)-i-1]=moto[i+1];
}

Gyaku[strlen(moto)]=’\0’;

Puts(“%s\n”,gyaku);

If(strcmp(moto,gyaku) == 0)
{
Puts(“回文です”);
}
Else
{
Puts(“回文ではありません”);
}
}

box
記事: 2002
登録日時: 14年前

Re: C言語で回文(日本語の文字列)の表示と判定を行うプログラミングを立てたのですが、上手く動きません。

#2

投稿記事 by box » 10年前

「うまく動かない」の定義は何ですか?
コンパイルエラーですか?実行時エラーですか?
何かメッセージは出ていますか?

また、回文の定義は何ですか?
「新聞紙」のばあい、ひらがなで「しんぶんし」と書けば左右対称なので
明らかに回文ですが、漢字で書けば左右対称にはなりませんね。でも、
「新聞紙」は一般には回文であるはずです。
「日本語の文字列」とは、かなで入力することを想定されていますか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: C言語で回文(日本語の文字列)の表示と判定を行うプログラミングを立てたのですが、上手く動きません。

#3

投稿記事 by みけCAT » 10年前

コードはBBcodeを有効にした状態でcodeタグで囲み、
かつ適切にインデントをしていただけると、見やすくて助かります。

10行目、23行目、27行目、31行目:C言語では文字列リテラルを表すのに“”は使えません。半角の""を使ってください。
11行目:C言語ではコメントと文字列リテラル以外に全角スペースを置くべきではありません。消してください。
16行目:C言語に≧という演算子はありません。>=を使ってください。
17行目:--演算子の使い方が間違っています。-の間違いでしょうか?
21行目:C言語では大文字と小文字を区別します。コード中にGyakuの定義は見当たりませんが、gyakuの間違いでしょうか?
21行目:C言語では文字定数を表すのに’’は使えません。半角の''を使ってください。
23行目:C言語では大文字と小文字を区別します。コード中にPutsの定義が見当たりませんし、標準ライブラリのputsと引数の数が一致しません。printfの間違いでしょうか?
25行目:C言語では大文字と小文字を区別します。Ifというマクロの定義が見当たりませんが、ifの間違いでしょうか?
27行目、31行目:C言語では大文字と小文字を区別します。Putsの定義が見当たりませんが、putsの間違いでしょうか?
29行目:C言語では大文字と小文字を区別します。Elseの定義が見当たりませんが、elseの間違いでしょうか?

とりあえず、以上の修正でRuntime Errorになりますが(Runtime Errorと判定されるのはmain関数が0を返していないからであると思われます)コンパイルは通りました。
なお、gets関数はバッファオーバーランのリスクがあり、使うべきではありません。
日本語に対応するにあたり、利用する文字コードは何でしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: C言語で回文(日本語の文字列)の表示と判定を行うプログラミングを立てたのですが、上手く動きません。

#4

投稿記事 by かずま » 10年前

質問者が、回答者のアドバイスを無視し続けて、
問題の解決が放置されているようなので、
あとから同じ問題で見に来る人のために
参考となるプログラムを書いてみました。

コード:

#include <stdio.h>  // puts, printf
#include <wchar.h>  // fgetws, wcscmp
#include <locale.h> // setlocale

int main(void)
{
    wchar_t moto[100], gyaku[100];
    int i, j;

    setlocale(LC_CTYPE, "");
    while (1) {
        puts("回文かどうかの判定をします。文字を日本語で入力してください。");
        if (!fgetws(moto, 100, stdin) || moto[0] == L'\n')) break;
        for (j = 0; moto[j] && moto[j] != L'\n'; j++) ;
        moto[j] = 0;shi
        for (i = 0; --j >= 0; i++) gyaku[i] = moto[j];
        gyaku[i] = 0;
        printf("moto=[%ls], gyaku=[%ls]\n", moto, gyaku);
        if (wcscmp(moto, gyaku) == 0)
            puts("回文です\n");
        else
            puts("回文ではありません\n");
    }
    return 0;
}
実行結果

コード:

回文かどうかの判定をします。文字を日本語で入力してください。
よのなかねかおかおかねかなのよ
moto=[よのなかねかおかおかねかなのよ], gyaku=[よのなかねかおかおかねかなのよ]
回文です

回文かどうかの判定をします。文字を日本語で入力してください。
世の中ね顔かお金かなのよ
moto=[世の中ね顔かお金かなのよ], gyaku=[よのなか金おか顔ね中の世]
回文ではありません

回文かどうかの判定をします。文字を日本語で入力してください。

実行前に環境変数 LANG を設定してください。
Linux なら export LANG=ja_JP.utf-8
Windows なら set LANG=ja_JP.cp932
などです。

かずま

Re: C言語で回文(日本語の文字列)の表示と判定を行うプログラミングを立てたのですが、上手く動きません。

#5

投稿記事 by かずま » 10年前

かずま さんが書きました:

コード:

        moto[j] = 0;shi
shi は余計です。
投稿時に誤ってゴミが入ってしまったようです。

それから、回文かどうかの判定なら、
文字列の先頭と末尾から中央に向かって
文字を順番に比較すれば済みます。
元のプログラムが、逆順の文字列を表示するように
なっていたので、それに従いました。

閉鎖

“C言語何でも質問掲示板” へ戻る