アプリ版:「スタンプのみでお礼する」機能のリリースについて

配列と文字列をあわせて使う以下のようなプログラムを作りました.エラーはでないのですが,最後の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;
}

A 回答 (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でないと使えないと思いますので、適当に書き換えてください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/04/02 11:50

正解は出てますが。


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

この回答への補足

以下のように改良しました.ひらがなだと変換後にはじめの文字が 、 になってしまいます.この対処法も教えていただけると助かります.

/*文字列を入力し,入力した文字列を逆の順番で表示するプログラム*/

#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;
}

補足日時:2013/03/30 14:03
    • good
    • 0
この回答へのお礼

勉強になります.ありがとうございます.
たしかに
(n+1)/2より小さいとすればいいですね.ご指摘ありがとうございます.

%のほうは少し調べましたが,よくわかりません.ご教授お願いします.

お礼日時:2013/03/30 13:48

文字列の先頭に終端文字(\0)をコピーしていると思います。



mozi[i]=mozi[n-i];
ではなく
mozi[i]=mozi[n-i-1];
では?
他のmoziのインデックスも同じです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/03/30 11:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!