• 締切済み

C言語 配列 文字列

配列と文字列をあわせて使う以下のようなプログラムを作りました.エラーはでないのですが,最後のprintfの部分が表示されません.どこが間違っているのでしょうか? /*文字列を入力し,入力した文字列を逆の順番で表示するプログラム*/ #include<stdio.h> #include<string.h> int main(void) { int i,n,t; char mozi[100]; printf("100字以下の文章を入力したら,逆にして表示します.\n"); gets(mozi); n=strlen(mozi); if(n%2) { for(i=0;i<(n-1)/2;i++) { t=mozi[i]; mozi[i]=mozi[n-i]; mozi[n-i]=t; } } else { for(i=0;i<n/2;i++) { t=mozi[i]; mozi[i]=mozi[n-i]; mozi[n-i]=t; } } printf(mozi); return 0; }

みんなの回答

回答No.3

> 以下のように改良しました.ひらがなだと変換後にはじめの文字が 、 になってしまいます.この対処法も教えていただけると助かります. char型では半角英数字を扱えても、日本語の文字のような多バイト文字は扱えないです。 日本語の文字に対して同じ事をしたかったらワイド文字を使ったほうが良いかもしれません。 この場合、適切なlocaleをsetlocaleしてcharの代わりにwchar_tを使います。 また、string.hに定義されているような文字列操作についての関数もwchar_t用のものに変える必要があります。 > %のほうは少し調べましたが,よくわかりません.ご教授お願いします. printf("%d")と書いたら何が起きるんでしょうね。 少なくとも%dという文字列を表示することはありません。 moziに"d%d"という文字列が設定されていた場合、printf(mozi)はprintf("d%d")となりませんか? 対処方法は2つあります。 一つはputsを使う方法で、もう一つはprintf関数を正確に書くことです。printf("%s", mozi)とすればmoziに%があっても文字列として表示するので%がそのまま表示されます。 というわけで、wchar_tを使って書いてみました。 #include <err.h> #include <locale.h> #include <stdio.h> #include <string.h> #include <wchar.h> int main(void) { size_t i, len; wchar_t t, moji[100]; if (setlocale(LC_CTYPE, "ja_JP.eucJP") == NULL) { errx(-1, "failed to change locale"); } printf("input?:"); fgetws(moji, sizeof(moji) / sizeof(moji[0]), stdin); len = wcslen(moji); for (i = 0;i < (len + 1) / 2; i++) { t = moji[i]; moji[i] = moji[len - i - 1]; moji[len - i - 1] = t; } wprintf(L"%ls\n", moji); return 0; } setlocaleで何を設定するかはOSや環境によって違いますが、ここではEUC-JPの文字コードで入出力することを想定しています。また、エラー処理を手抜きしたかったのでerrx関数を使いましたが、これはglibcかBSD系のlibcでないと使えないと思いますので、適当に書き換えてください。

masics
質問者

お礼

回答ありがとうございます.

すると、全ての回答が全文表示されます。
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

正解は出てますが。 ・偶数奇数分ける必要ないはずです。 ・入力する文字列に%を混ぜてください。変なことになるはずです。理由と対策わかりますか?

masics
質問者

お礼

勉強になります.ありがとうございます. たしかに (n+1)/2より小さいとすればいいですね.ご指摘ありがとうございます. %のほうは少し調べましたが,よくわかりません.ご教授お願いします.

masics
質問者

補足

以下のように改良しました.ひらがなだと変換後にはじめの文字が 、 になってしまいます.この対処法も教えていただけると助かります. /*文字列を入力し,入力した文字列を逆の順番で表示するプログラム*/ #include<stdio.h> #include<string.h> int main(void) { int i,n,t; char mozi[100]; printf("100字以下の文章を入力したら,逆にして表示します.\n"); gets(mozi); n=strlen(mozi); for(i=0;i<(n+1)/2;i++) { t=mozi[i]; mozi[i]=mozi[n-i-1]; mozi[n-i-1]=t; } printf(mozi); return 0; }

すると、全ての回答が全文表示されます。
noname#208507
noname#208507
回答No.1

文字列の先頭に終端文字(\0)をコピーしていると思います。 mozi[i]=mozi[n-i]; ではなく mozi[i]=mozi[n-i-1]; では? 他のmoziのインデックスも同じです。

masics
質問者

お礼

なるほど.うまく動きました.ありがとうございます. 終端文字というのは文字列の最後のヌル文字ですかね?

すると、全ての回答が全文表示されます。
このQ&Aのポイント
  • 全保連株式会社からの建替賃料振込支払い通知書『コンビニ支払い』について疑問を抱いている人がいます。この通知書の正体に関する情報を提供します。
  • 全保連株式会社から『コンビニ支払い』の建替賃料振込支払い通知書が送られてきたが、これが何を意味するのか疑問です。詳細を確認しましょう。
  • 全保連株式会社の建替賃料振込支払い通知書が届いたが、その内容や目的について詳しく知りたい方へ。『コンビニ支払い』の通知書の意味を解説します。
回答を見る

専門家に質問してみよう