• 締切済み

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

専門家に質問してみよう