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

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

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

#1

投稿記事 by bonbo » 14年前

はじめまして、早速ですが質問させていただきます。
今、全角文字を配列で管理しようと思い↓のようなプログラムをまねして書いたのですが
------------------------------------------------------------------
#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文字目だけしか表示してくれません。
どうしたら全文字表示してくれるのでしょうか。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

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

#2

投稿記事 by h2so5 » 14年前

%lc を %ls に変えてみてください。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

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

#3

投稿記事 by ISLe » 14年前

文字列じゃなくて文字を代入しているようにしか見えませんけど。

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

bonbo

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

#4

投稿記事 by bonbo » 14年前

>h2so5さん
ありがとうございます。
やってみたところ
「ハンドルされていない例外が発生しました」
とエラーが出てできませんでした…

bonbo

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

#5

投稿記事 by bonbo » 14年前

>ISLeさん
ありがとうございます。
すみません、文章のことを文字列だと勘違いしています。
つまり、そもそもこの形式では
やさい
にく
と表示させるのは不可能ということでしょうか…

naohiro19
記事: 256
登録日時: 15年前
住所: 愛知県

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

#6

投稿記事 by naohiro19 » 14年前

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を使ってください。
最後に編集したユーザー naohiro19 on 2012年6月15日(金) 23:54 [ 編集 2 回目 ]

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

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

#7

投稿記事 by ISLe » 14年前

bonbo さんが書きました:すみません、文章のことを文字列だと勘違いしています。
文字と文字列は区別してください。

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

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

bonbo

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

#8

投稿記事 by bonbo » 14年前

>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を使う限りでは不可能なんですね…
文字列のほうがよくわからないのですが具体的にどうすれば…

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

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

#9

投稿記事 by ISLe » 14年前

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

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

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

#10

投稿記事 by ISLe » 14年前

文字と文字列の区別ができていれば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: 複数の文字列を配列で管理したい

#11

投稿記事 by へにっくす » 14年前

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なのは、終端文字を含むため
でも可能です。

bonbo

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

#12

投稿記事 by bonbo » 14年前

返信が遅くなりました。
みなさんありがとうございます。
文字の扱いをあいまいにしたまま次に進もうとしたのが甘かったのですね…
>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);
}
------------------------------------------------------------------
平面管理はまたエラーでしたが、一応知りたかったことが解決したので解決としておきます。
みなさんどうもありがとうございました。

bonbo

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

#13

投稿記事 by bonbo » 14年前

平面管理のほうも成功しました!!
ありがとうございます!
---------------------------------------------------------------
#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]);
}

bonbo

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

#14

投稿記事 by bonbo » 14年前

ISLeさんの言っていたほうでもできました!また勘違いしてたみたいです
ありがとうございました!

閉鎖

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