ページ 11

複数の文字列を配列で管理したい

Posted: 2012年6月15日(金) 23:02
by bonbo
はじめまして、早速ですが質問させていただきます。
今、全角文字を配列で管理しようと思い↓のようなプログラムをまねして書いたのですが
------------------------------------------------------------------
#include <stdio.h>
#include <locale.h>

int main(){
wchar_t a[10][5];
a[2][3] = L'やさい';
a[4][0] = L'にく';
setlocale(LC_CTYPE, "JAPANESE");
printf("%lc\n",a[2][3]);
printf("%lc\n",a[4][0]);
return 0;
}
-------------------------------------------------------------------
実行結果
-------------------------------------------------------------------




------------------------------------------------------------------
と1文字目だけしか表示してくれません。
どうしたら全文字表示してくれるのでしょうか。

Re: 複数の文字列を配列で管理したい

Posted: 2012年6月15日(金) 23:06
by h2so5
%lc を %ls に変えてみてください。

Re: 複数の文字列を配列で管理したい

Posted: 2012年6月15日(金) 23:13
by ISLe
文字列じゃなくて文字を代入しているようにしか見えませんけど。

あと'複数文字'は処理系依存だったと思います。

Re: 複数の文字列を配列で管理したい

Posted: 2012年6月15日(金) 23:13
by bonbo
>h2so5さん
ありがとうございます。
やってみたところ
「ハンドルされていない例外が発生しました」
とエラーが出てできませんでした…

Re: 複数の文字列を配列で管理したい

Posted: 2012年6月15日(金) 23:18
by bonbo
>ISLeさん
ありがとうございます。
すみません、文章のことを文字列だと勘違いしています。
つまり、そもそもこの形式では
やさい
にく
と表示させるのは不可能ということでしょうか…

Re: 複数の文字列を配列で管理したい

Posted: 2012年6月15日(金) 23:47
by naohiro19
Visual Studio なら標準でユニコードに対応しているので

コード:

#include <stdio.h>
#include <tchar.h>
#include <locale.h>
int main(){
	setlocale(LC_CTYPE, "japanese");
	wchar_t* str = L"C言語なんでも質問掲示板";
	wprintf(L"%s\n", str );
}
のように可能です。

printfはマルチバイト文字列用なので使えませんが上記のプログラムのようにwprintfを使ってください。

Re: 複数の文字列を配列で管理したい

Posted: 2012年6月15日(金) 23:53
by ISLe
bonbo さんが書きました:すみません、文章のことを文字列だと勘違いしています。
文字と文字列は区別してください。

やさい
にく
と表示させるのに文字だけを使う方法と文字列を使う方法があります。

wchar_tは文字なので一文字しか表現できません。
文字列は文字の配列です。
printfで文字列を表示するなら終端文字が必要です。

Re: 複数の文字列を配列で管理したい

Posted: 2012年6月16日(土) 00:20
by bonbo
>naohiro19さん
ありがとうございます。
それを応用して配列を使った管理にしたかったのですが
どこを改変していいのか教えて頂けないでしょうか…
------------------------------------------
#include <stdio.h>
#include <tchar.h>
#include <locale.h>
int main(){
setlocale(LC_CTYPE, "japanese");
wchar_t* str[10][10] = L"やさい";
wprintf(L"%s\n", str[10][10] );
}
--------------------------------------------------------
こんな風に改変してみたのですがエラーでした…


>ISLeさん
ありがとうございます。
wchar_tを使う限りでは不可能なんですね…
文字列のほうがよくわからないのですが具体的にどうすれば…

Re: 複数の文字列を配列で管理したい

Posted: 2012年6月16日(土) 01:19
by ISLe
bonbo さんが書きました:wchar_tを使う限りでは不可能なんですね…
文字列のほうがよくわからないのですが具体的にどうすれば…
違いますよ。
wchar_t a[10][5];
という宣言に対して
a[2][3]やa[4][0]がwchar_t型なので一文字しか代入できないのです。
そのとおりの結果を確認していますよね。

Re: 複数の文字列を配列で管理したい

Posted: 2012年6月16日(土) 01:40
by ISLe
文字と文字列の区別ができていればcharでもwchar_tでも同じなんですが。
区別できていないならまず基本から勉強してください。

コード:

#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main(void) {
	wchar_t a[10][5];
	setlocale(LC_CTYPE, "japanese");

	/* 一文字ずつ代入 */
	a[2][0] = L'や';
	a[2][1] = L'さ';
	a[2][2] = L'い';
	a[2][3] = L'\0';
	a[4][0] = L'に';
	a[4][1] = L'く';
	a[4][2] = L'\0';
	printf("%ls\n",a[2]);
	printf("%ls\n",a[4]);

	/* 文字列を複写 */
	wcscpy(a[3], L"やさい");
	wcscpy(a[5], L"にく");
	printf("%ls\n",a[3]);
	printf("%ls\n",a[5]);

	return 0;
}

Re: 複数の文字列を配列で管理したい

Posted: 2012年6月16日(土) 01:43
by へにっくす
bonbo さんが書きました:

コード:

#include <stdio.h>
#include <tchar.h>
#include <locale.h>
int main(){
    setlocale(LC_CTYPE, "japanese");
    wchar_t* str[10][10] = L"やさい";
    wprintf(L"%s\n", str[10][10] );
} 
こんな風に改変してみたのですがエラーでした…
当たり前。
たとえば

コード:

wchar_t* str[10];
と宣言したなら、str[0]~str[9]までしか使えないから。
配列の添え字について理解できてますか?
それに代入の仕方を間違えています。

コード:

wchar_t* str[] = {L"やさい", L"ねぎ"};
wprintf(L"%s\n", str[0]);
wprintf(L"%s\n", str[1]);
上の1行目は、

コード:

wchar_t* str[2] = {L"やさい", L"ねぎ"};
でも

コード:

wchar_t str[2][4] = {L"やさい", L"ねぎ"}; // 4なのは、終端文字を含むため
でも可能です。

Re: 複数の文字列を配列で管理したい

Posted: 2012年6月16日(土) 07:55
by bonbo
返信が遅くなりました。
みなさんありがとうございます。
文字の扱いをあいまいにしたまま次に進もうとしたのが甘かったのですね…
>ISLeさん
なるほど、一文字ずつ三次配列にして使えば可能だが、
ただやっぱり文章そのものを数字のように扱って%sに代入して出力するような機能は
無いのですね…

>へにっくすさん
ああ!
wchar_t* str[10];
これは宣言だったんですね!なんてとんちんかんなことを…
やってみたらできましたー!!!
ありがとうございます!
一応できたプログラムを張っておきます。何かおかしいところあったらまたよろしくお願いします。
-----------------------------------------------
#include <stdio.h>
#include <tchar.h>
#include <locale.h>
int main(){
int a;
setlocale(LC_CTYPE, "japanese");
wchar_t* str[] ={
L"代入したい0番目",
L"代入したい1番目",
};
wprintf(L"代入したい0番目=%s\n", str[0]);
wprintf(L"代入したい1番目=%s\n", str[1]);
scanf("%d",&a);
}
------------------------------------------------------------------
平面管理はまたエラーでしたが、一応知りたかったことが解決したので解決としておきます。
みなさんどうもありがとうございました。

Re: 複数の文字列を配列で管理したい

Posted: 2012年6月16日(土) 08:08
by bonbo
平面管理のほうも成功しました!!
ありがとうございます!
---------------------------------------------------------------
#include <stdio.h>
#include <tchar.h>
#include <locale.h>
int main(){
setlocale(LC_CTYPE, "japanese");
wchar_t* str[2][2] ={
{L"にく", L"やさい" },
{L"ミート", L"ベジタブル" },
};
wprintf(L"代入したい0番目=%s\n", str[0][0]);
wprintf(L"代入したい1番目=%s\n", str[1][1]);
}

Re: 複数の文字列を配列で管理したい

Posted: 2012年6月16日(土) 11:07
by bonbo
ISLeさんの言っていたほうでもできました!また勘違いしてたみたいです
ありがとうございました!