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(“回文ではありません”);
}
}
C言語で回文(日本語の文字列)の表示と判定を行うプログラミングを立てたのですが、上手く動きません。
Re: C言語で回文(日本語の文字列)の表示と判定を行うプログラミングを立てたのですが、上手く動きません。
「うまく動かない」の定義は何ですか?
コンパイルエラーですか?実行時エラーですか?
何かメッセージは出ていますか?
また、回文の定義は何ですか?
「新聞紙」のばあい、ひらがなで「しんぶんし」と書けば左右対称なので
明らかに回文ですが、漢字で書けば左右対称にはなりませんね。でも、
「新聞紙」は一般には回文であるはずです。
「日本語の文字列」とは、かなで入力することを想定されていますか?
コンパイルエラーですか?実行時エラーですか?
何かメッセージは出ていますか?
また、回文の定義は何ですか?
「新聞紙」のばあい、ひらがなで「しんぶんし」と書けば左右対称なので
明らかに回文ですが、漢字で書けば左右対称にはなりませんね。でも、
「新聞紙」は一般には回文であるはずです。
「日本語の文字列」とは、かなで入力することを想定されていますか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: C言語で回文(日本語の文字列)の表示と判定を行うプログラミングを立てたのですが、上手く動きません。
コードは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関数はバッファオーバーランのリスクがあり、使うべきではありません。
日本語に対応するにあたり、利用する文字コードは何でしょうか?
かつ適切にインデントをしていただけると、見やすくて助かります。
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言語で回文(日本語の文字列)の表示と判定を行うプログラミングを立てたのですが、上手く動きません。
質問者が、回答者のアドバイスを無視し続けて、
問題の解決が放置されているようなので、
あとから同じ問題で見に来る人のために
参考となるプログラムを書いてみました。
実行結果
実行前に環境変数 LANG を設定してください。
Linux なら export LANG=ja_JP.utf-8
Windows なら set LANG=ja_JP.cp932
などです。
問題の解決が放置されているようなので、
あとから同じ問題で見に来る人のために
参考となるプログラムを書いてみました。
#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=[よのなか金おか顔ね中の世]
回文ではありません
回文かどうかの判定をします。文字を日本語で入力してください。
Linux なら export LANG=ja_JP.utf-8
Windows なら set LANG=ja_JP.cp932
などです。