配列と文字列をあわせて使う以下のようなプログラムを作りました.エラーはでないのですが,最後の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件)
- 最新から表示
- 回答順に表示
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でないと使えないと思いますので、適当に書き換えてください。
No.2
- 回答日時:
正解は出てますが。
・偶数奇数分ける必要ないはずです。
・入力する文字列に%を混ぜてください。変なことになるはずです。理由と対策わかりますか?
この回答への補足
以下のように改良しました.ひらがなだと変換後にはじめの文字が 、 になってしまいます.この対処法も教えていただけると助かります.
/*文字列を入力し,入力した文字列を逆の順番で表示するプログラム*/
#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;
}
勉強になります.ありがとうございます.
たしかに
(n+1)/2より小さいとすればいいですね.ご指摘ありがとうございます.
%のほうは少し調べましたが,よくわかりません.ご教授お願いします.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
charと%c , %s の関係について
-
sscanfとscanfの違いがよくわか...
-
C言語の初心者です。これを実行...
-
C言語で16進数文字列から16進数...
-
CStringについて
-
fgetsで拾われる改行文字を削除...
-
strstrを利用しない文字列検索...
-
fgets関数を使用したときの文字...
-
こんにちは。いつもお世話にな...
-
C言語のステップ数をカウントす...
-
単語数のカウントについて
-
1行の文字列を時間差で表示する...
-
CStringのFindで文字列検索を行...
-
C言語 空白の行(改行のみ)が...
-
C言語:配列の中の文字を。。。
-
記号を入出力する際の指定子
-
getchar分を用いて入力された文...
-
文の意味
-
C++
-
ある文字列で2回目3回目に出現...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
sscanfとscanfの違いがよくわか...
-
反転した数値を表示させるやり方
-
fgets関数を使用したときの文字...
-
C言語 空白の行(改行のみ)が...
-
charと%c , %s の関係について
-
C言語のステップ数をカウントす...
-
fgetsで拾われる改行文字を削除...
-
itoaわかりません
-
C言語で16進数文字列から16進数...
-
strstrを利用しない文字列検索...
-
文字列中に含まれる文字の個数...
-
Cで「大文字、小文字の判定」は...
-
エディットボックスに入力され...
-
1行の文字列を時間差で表示する...
-
文字列の途中に「0」がある場...
-
[Java]文字列分割
-
教えていただけませんか?C言語...
-
atoiでの文字列以外のエラー処...
-
ブランクのチェック
おすすめ情報