C言語プログラムの文字化け

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
walk_f

C言語プログラムの文字化け

#1

投稿記事 by walk_f » 11年前

こんばんは。
私は今、英文を読み込んで文字ごとに区切り、全て小文字にして出力するプログラムをc言語で作っています。
例)入力:This is a pen. 出力結果:t h i s i s a p e n .
このプログラムは一応完成し、実行しても上手く動いてくれます。
しかし、結果をテキストファイルに出力する際、入力する文章が長い(4行程度)と文字化け?してしまいます
(入力文章が短いと正常に動作します)。
ターミナル上で動かすときは長文でも正常に文字ごとに区切った結果出ますが、
テキストファイルに結果を出力するとダメです…。
文字化けの内容は「・」と無数の乗数の組み合わせです。
OSはwindows8.1、エディタはemacs、ターミナルはminttyで、いずれもwindows対応版です。
ターミナル上では
./alphabet_letter < input.txt > output.txt
と入力しています。今はoutput.txtの中身が文字化けしています。
対策・改善の仕方が分からないので、皆様のご意見をお聞きしたいです。
以下プログラムと入力を貼ります。よろしくお願いします。

<プログラム>

コード:

#include<stdio.h>
#include<string.h>

//小文字にする
void tolower_letter(char *c)
{
  char ch = *c - 'A';
  (*c) = 'a' + ch;
}

//単語の長さを調べる
int search_length(char str[])
{
  int length = 0;

  while( str[length] != '\0' ) length++;

  return(length);
}

//単語を文字ごとに区切って出力する
void make_alphabet(char str[],int l)
{
  int i;

  for(i=0; i<l; i++)
    if( str[i] >= 'A' && str[i] <= 'Z' ) tolower_letter(&str[i]);

  for(i=0; i<l; i++) printf("%c ",str[i]);

}

int main(void)
{
  char str[40];
  int n,i,length,flag; 
  
  do
    {
      fflush(stdout);     //これを書かないとscanfで動作が一旦止まってしまうので書いています
      scanf("%s",str);
      length = search_length(str);

      //「***」が来たらプログラムを終了します(終了条件)。
      flag = 0;
      if( length == 3 )
	for(i=0; i<3; i++)
	  if( str[i] == '*' ) flag++;
      
      if( flag != 3 ) make_alphabet(str,length);
    }
  while( flag != 3 );

  return(0);
}
<入力(input.txtの中身)>
As a little girl, I always imagined I would one day run away. From the age of six on, I kept a packed bag with some clothes and cans of food tucked away in the back of a closet. There was a deep restlessness in me, a primal fear that I would fall prey to a life of routine and boredom. And so, many of my early memories involved intricate daydreams where I would walk across borders, forage for berries, and meet all kinds of strange people living unconventional lives on the road.

walk_f

Re: C言語プログラムの文字化け

#2

投稿記事 by walk_f » 11年前

ごめんなさい、訂正です。
<入力(input.txtの中身)>
As a little girl, I always imagined I would one day run away. From the age of six on, I kept a packed bag with some clothes and cans of food tucked away in the back of a closet. There was a deep restlessness in me, a primal fear that I would fall prey to a life of routine and boredom. And so, many of my early memories involved intricate daydreams where I would walk across borders, forage for berries, and meet all kinds of strange people living unconventional lives on the road. ***
「***」を付け忘れていました。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: C言語プログラムの文字化け

#3

投稿記事 by みけCAT » 11年前

Windows Vista Home Premium SP2 32ビット
Intel(R) Core(TM)2Duo T8100 @2.10GHz 2.10GHz
RAM 4.00GB
GCC 4.8.1
サクラエディタ 2.1.1.3
コマンドプロンプト

実行したコマンド(YUKI.N>はプロンプト)

コード:

YUKI.N>g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=c:/dev-cpp/mingw32/bin/../libexec/gcc/mingw32/4.8.1/lto-wrap
per.exe
Target: mingw32
Configured with: ../gcc-4.8.1/configure --prefix=/mingw --host=mingw32 --build=m
ingw32 --without-pic --enable-shared --enable-static --with-gnu-ld --enable-lto
--enable-libssp --disable-multilib --enable-languages=c,c++,fortran,objc,obj-c++
,ada --disable-sjlj-exceptions --with-dwarf2 --disable-win32-registry --enable-l
ibstdcxx-debug --enable-version-specific-runtime-libs --with-gmp=/usr/src/pkg/gm
p-5.1.2-1-mingw32-src/bld --with-mpc=/usr/src/pkg/mpc-1.0.1-1-mingw32-src/bld --
with-mpfr= --with-system-zlib --with-gnu-as --enable-decimal-float=yes --enable-
libgomp --enable-threads --with-libiconv-prefix=/mingw32 --with-libintl-prefix=/
mingw --disable-bootstrap LDFLAGS=-s CFLAGS=-D_USE_32BIT_TIME_T
Thread model: win32
gcc version 4.8.1 (GCC)

YUKI.N>ls
alphabet_letter.cpp  input.txt

YUKI.N>g++ -O2 -s -static -o alphabet_letter.exe alphabet_letter.cpp

YUKI.N>alphabet_letter.exe < input.txt > output.txt

YUKI.N>
以上の条件で再現できませんでした。
使用しているコンパイラはなんですか?
文字化けしているoutput.txtをアップロードすることはできますか?
アップローダの例:http://www1.axfc.net/uploader/
添付ファイル
alphabet_letter.cpp
ソースコード
(1014 バイト) ダウンロード数: 105 回
input.txt
入力ファイル
(485 バイト) ダウンロード数: 108 回
output.txt
出力ファイル
(778 バイト) ダウンロード数: 98 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 14年前

Re: C言語プログラムの文字化け

#4

投稿記事 by box » 11年前

本題と関係あるかどうかはわかりませんが、
tolower_letter

search_length
は、標準関数に同等の機能を持つものがあります。
自作関数であることが必須条件ですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

walk_f

Re: C言語プログラムの文字化け

#5

投稿記事 by walk_f » 11年前

>>みけCAT様
返信ありがとうございます。
コンパイラはcygwinのgccです。
output.txtはこちらです。
http://www1.axfc.net/u/3261424
エラーの意味がよくわからないのですが、どういう事なのでしょうか?
理解が乏しくて申し訳ございません。

>>box様
返信ありがとうございます。
str_length関数とtolower関数のことですよね?
とくに意味はないのですが、標準関数になるべく頼らないようにしようと思いまして、
当初はstring.hもctype.hも使わないようにしようと思っていました。結局string.hはインクルードしましたが・・・。
見づらくなってしまってごめんなさい。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: C言語プログラムの文字化け

#6

投稿記事 by みけCAT » 11年前

walk_f さんが書きました:>>みけCAT様
返信ありがとうございます。
コンパイラはcygwinのgccです。
output.txtはこちらです。
http://www1.axfc.net/u/3261424
エラーの意味がよくわからないのですが、どういう事なのでしょうか?
理解が乏しくて申し訳ございません。
こちらで生成したファイルと完全に一致しました。
テキストファイルの閲覧ソフトの問題だと思います。
「無数の乗数の組み合わせ」というのがよくわからないんですが、スクリーンショットをアップロードできますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

walk_f

Re: C言語プログラムの文字化け

#7

投稿記事 by walk_f » 11年前

>>みけCAT様
言葉の表現が下手でごめんなさい…混乱させてしまったかもしれません。
スクリーンショットです。
http://www1.axfc.net/u/3261442
文字化けは横に長いので最初の部分しか映っていませんが…。
スクリーンショットにある通り、メモ帳で見ているわけですが、
メモ帳に問題があるということですか?

box
記事: 2002
登録日時: 14年前

Re: C言語プログラムの文字化け

#8

投稿記事 by box » 11年前

walk_f さんが書きました: str_length関数とtolower関数のことですよね?
strlenならば、知っています。str_lengthという標準関数は知りません。
walk_f さんが書きました: 標準関数になるべく頼らないようにしようと思いまして、
私は、標準関数が使えるならば使うようにしています。
自作するとバグが出る、標準関数ならばその危険性は低い、というのが理由です。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

walk_f

Re: C言語プログラムの文字化け

#9

投稿記事 by walk_f » 11年前

>>box様
ごめんなさい、str_lengthでありませんでした。
標準関数を使った方が危険が低いのは知りませんでした。
まだプログラミング歴が浅いのでなるべく自分で関数を作ってC言語に慣れようと思っていましたが、
標準関数も使いこなせるように努力していきたいと思います。
box様のご意見、参考にさせていただきます、ありがとうございます。

box
記事: 2002
登録日時: 14年前

Re: C言語プログラムの文字化け

#10

投稿記事 by box » 11年前

念のため
バグの出やすさについて
標準関数:自作よりは低い(という意味で危険度が低い、ということ)
自作関数:標準関数よりは高いであろう

ということです。

なお、標準関数と同等の機能を持つような関数を自作すること自体を
否定するものではありません。練習の題材としてはひじょうに適切であると思います。
というのは、何を入力したら何が返ってくるのか、標準関数というお手本が
すぐとなりにいるわけで。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: C言語プログラムの文字化け

#11

投稿記事 by みけCAT » 11年前

こちらでoutput.txtをメモ帳にドラッグ&ドロップしたところ、文字化けしました。
文字コードの自動判別に失敗しているようです。
メニューの「開く」からファイルを選び、そのときに文字コードを「UTF-8」に設定してファイルを開いたところ、
こちらでは正常に表示されました。

単純に疑問に思ったのですが、なぜ出力をemacsではなくメモ帳で確認しているのですか?
添付ファイル
output_memo.png
メモ帳にドラッグ&ドロップした結果(フォントはVL ゴシック)
output_memo.png (22.58 KiB) 閲覧数: 5633 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

walk_f

Re: C言語プログラムの文字化け

#12

投稿記事 by walk_f » 11年前

>>box様
分かりました、これからも継続的にプログラミングの練習をしていきたいと思います!

>>みけCAT様

みけCAT様のおっしゃる通り、emacsでoutput.txtを開いたらちゃんと正常に結果が出力されていました。
C-x R-fで文字コードをutf-8にしたら大丈夫でした。
迷惑をおかけして申し訳ございませんでした。「.txtファイルといえば、メモ帳」という謎の固定観念にとらわれて、
すっかりemacsでtxtファイルを開くことを忘れていました。
本当にごめんなさい。

メモ帳の方で開くと文字化けしたままですが、emacsでoutput.txtを開いて、その中身をコピーしてメモ帳に貼り付けたら
メモ帳でも正常に見れました(この行為にあまり意味はありませんが)。

本当に助かりました、今までお付き合いいただき、本当にありがとうございました!

walk_f

Re: C言語プログラムの文字化け

#13

投稿記事 by walk_f » 11年前

すいません、解決ボタン押し忘れましたので重複になりますが、コメントを投稿させていただきます。

閉鎖

“C言語何でも質問掲示板” へ戻る