• ベストアンサー

日本語データを配列に収める方法

terra5の回答

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.2

この手の問題は処理系,環境,コンパイラ,実際のプログラムが無いと判断が難しいです。 自分で問題だと判断したところでなく,なるべく全体を、 何をしたいかを書いたほうがいいですよ。 全く関係の無いと思っていたところが,問題な場合もありますし。 fgetcで失敗するのは,プログラムに問題(バグ)があるような気がしますが,実際のソースコードがないと判断つきません。

noname#4530
質問者

お礼

アドバイスありがとうございました。 昨日あきらめて、今日起きてちょっといじったら、うまくいきました。 小さなところを間違えていたようです…お騒がせしてすみませんでした。 それにしても、まだ解らないことがタックサンです。 日本語データを、char型の配列data[]にいれたとすると、 printf("%c",data[0]);でも、 printf("%c %c",data[0],data[1]);でも何も表示されないのに、 printf("%c%c",data[0],data[1]);ならちゃんと日本語が1文字表示されちゃうんですよね~2バイト文字を表示するには連続して表示しなければいけないというルールがあるのかな…??? int型の配列idata[]に同じデータを入れてみても、 printf("%c",idata[0]);でも、 printf("%c %c",idata[0],idata[1]);でも何も表示されないのに、 printf("%c%c",idata[0],idata[1]);ならちゃんと日本語が1文字表示されちゃうんですよね~。int型は2バイト以上あるはずなのに、、、 日本語1文字につき、何が何でも2つの変数に入れなくてはならないのでしょうか?

関連するQ&A

  • 日本語を配列に収め、そして表示するには?

    日本語が書かれたファイルから、その日本語をEUCコードとして配列に収めたいのですが、どうすればいいのでしょう? 英字だったらchar型の配列に入れてしまえばいいですが、char型って1バイトの入れ物ですよね。日本語は2バイト... int型に入れちゃっていいんでしょうか?…でも、今度はその配列に収めた日本語を表示するトキはどうしたらいいんでしょ??書式は%cでいいのですかね…?(EUCコードで表示するときと、他のコードで表示するトキはどうやって区別するんだろ?というのも疑問です。) よろしくお願いいたします。

  • C/C++等で1次元配列を2次元配列に代入する方法

    凄く簡単な事だと思うのですが分からないので質問させて下さい。 例えば、 char a[10][20] ; char b[20] = "代入したいデータ" ; という配列がある場合、このa[0]の行にbの文字列を入れるにはどうしたら良いのでしょうか。 よろしければ回答をよろしくお願い致します。

  • 配列の要素数を調べる方法

    配列の中にいくつ要素があるか後から調べる方法はあるでしょうか? int test[4][3] = {   {0,1,2},   {0,1,2},   {0,1,2},   {0,1,2}, } ; 上のケースだと、X方向に3、Y方向に4つの 要素があります。しかし、これだとあらかじめいくつ要素があるかを決めて 置かないといけません。 例えば、 int test[] = {0,1,2,3....} みたいに宣言された場合や、 char *test[] = {   "ああああああ",   "いいいいいい",   "うううううう",      ・      ・ //(これは文字列の数を要素数とします) } ; のように宣言された二次元配列などで、後から配列内にいくつ要素があるかを 調べることなどは可能でしょうか?

  • 漢字を配列に入れたいのですが

    漢字を配列に入れたいのですが、うまくいきません。 3列、60行のcsvファイルを読み込んで配列に入れようをしているのですが、1列目、2列目、3列目にある漢字をそれぞれ配列に入れようとしているのですが、出力するとうまくいかないんです。誰か教えてください。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXBUFFSIZE 256 #define MAXWORDS 15 int split(char* words[], int length, char* split_ch,char* str){ int i,j; for(i=0;i<length;i++){ if((words[i] = strtok(str,split_ch))==NULL)break; str=NULL; } return(i); } int main(int argc, char* argv[]){ if(argc !=2){ printf("入力エラー"); return(0); } FILE *fp; char *ll, *words[MAXWORDS], ch, buff[MAXBUFFSIZE]; int i,j; unsigned int data1[60], data2[60], data3[60]; if((fp =fopen(argv[1],"r"))==NULL){ printf("ファイルが開けません。\n"); } j=0; ll= fgets(buff,MAXBUFFSIZE,fp); while((ll= fgets(buff,MAXBUFFSIZE,fp)) != NULL){ split(words, MAXWORDS, ",",ll); data1[j] = words[0]; data2[j] = words[1]; data3[j] = words[2]; j++; } printf("%s\n%s\n%s\n", data1,data2,data3); }

  • char *data[20]; のデータの行方

    ファイルからデータを1行ずつ読み取り、 その行をコンマで分割して 1行毎の一時保管にこのchar型ポインタの配列を使っているのですが、 この場合データはどうなるのでしょうか? 以前、 >char *p = "文字列"; >等とすると、そのデータはメモリのどこかに静的に置かれてしまう >constを付けて保護しなければならない。 的な注意を見たのですが 1.この使い方は危険なのでしょうか? 2.ポインタで受け取ると、全ファイル分のデータが静的メモリとして   どこかに漂ってしまったりするのでしょうか? わかる方、いらっしゃいましたら教えて下さると幸いです。

  • 読み込んだデータを配列へ代入する方法

    ---ここから--- 1,2 3,4 ---ここまで--- このようなファイルを読み込んでデータを配列へ格納するには, $pathname="D://data.txt"; open MYFILE, "$pathname"; @list=<MYFILE>; for($i=0;$i<2;$i++){ @dat=split(/,/,$list[$i]); print @dat; } close MYFILE; といったようなforあるいはwhileで1つの配列(上の場合だと@dat)に1行のデータを繰り返し入れていく方法しか思い浮かびません。できれば1行目のデータは@dat1という配列へ,2行目のデータは@dat2という配列へ,といったように行ごとに別々の配列へ代入させたいのですが良い方法はないでしょうか。 もしくは@dat=([1,2],[3,4])のような2次配列の形にでもできれば最高なのですが、、、

    • ベストアンサー
    • Perl
  • fgetc()関数の動作について

    Visual Studio 2008(C++) において↓のようなコードを書いてビルドして、デバッグなしで実行すると、 コンソール上でちゃんとファイルの文字がコンソールに表示されます。 ところで、fgetc()関数のリファレンスを見ると、戻り値がint型を返すと書いてあるのに、 このコードだとchar型のバッファで受けています。char型でもfgetc() 関数の戻り値を受けられる理由がわかりません。 これはやはり、fgetc()がShift-JISコードの文字コード番号そのものを返しているのでしょうか。 (int型の配列で各要素にfgetc()の戻り値をみると、ファイル上の文字の文字コード番号が 入っています。) char型で受けると、文字そのものを受けられるのでしょうか? また、char型で受けた時に、char(1バイト)で、EOF(2バイト)をどうやって格納し、識別しているの でしょうか。 初歩的な質問で申し訳ありませんが、ご回答、よろしくお願いします。 #include <iostream> using namespace std; int main(){ FILE *fin = fopen("testa.txt", "r"); if(!fin){ "入力ファイルをオープンできません。"; return 1; } int i=0; char buf[20]; while((buf[i] = fgetc(fin))!=EOF){ i++; } buf[i]='\0'; cout << buf << endl; return 0; }

  • c言語の配列の境界調整について

    c言語の配列の境界調整について 以前、タイトル(c言語の境界調整について)の回答内容中で「データ型のアライメントとは何か、なぜ必要か」の下記のURLを紹介された中の配列の部分を 教えて頂きたい。 5.2 複合データ型の各要素のオフセット記述している、  (char * )&D == (char *)&D + offsetof(D_t, Di) は、配列にも適用されるのです か たとえば、 char s[4] = {1.2.3,4}; の場合    char * が 4バイトであれば、先頭のアドレスは、4バイトアライメントで    次の配列の要素は、1バイトアライメントでよろしいでしょうか   (http://www5d.biglobe.ne.jp/~noocyte/Programming/Alignment.html)

  • 文字、(ホワイト)スペース、数値の混在したデータの読み込み(C言語)

    Initial  time  01:05  date  00/01/01 name a:2 b:3 10 20 30 ・ ・ ・ 上記のようなテキストファイルで、6行目以降の数値を配列に格納して統計処理を考えています。自分ではfgetsが行の終端まで読むのを利用して、まず十分な長さのchar型配列を5つ用意し、1行目~5行目まではそれに格納し、6行目以降はfscanfで読む事を考えたのですが、printfで表示させると格納した文字や、計算の結果期待できる数値と異なる表示になってしまいます。良い方法があれば教えて頂きたく存じます。よろしくお願い致します。

  • fgetsで配列に数字を入れる。

    C言語についての質問です。 配列の中にひとつずつ数字を入れたいと思っています。 char suuzi[16]; fgets(suuzi, sizeof(suuzi), stdin); のような感じで読み込ませてるのですが、数字で読み込まれず文字として読み込まれてるみたいです。 数字として配列にひとつずついれるにはどのようにしたらよいかどなたか教えてください。