ページ 1 / 1
文字列の配列
Posted: 2009年3月19日(木) 19:49
by 昴
こんばんは、いつもお世話になっています。
C言語は初心者で、現在テキストを参考にしながら進めています。
WindowsのVistaを使っております。
char a[12] = "愛している";
このとき、'愛'だけを表示させるにはどうしたら、よいですか?
全角文字は2バイトで表現されるので、printf("%c", a[0]);はおかしいです。
Re:文字列の配列
Posted: 2009年3月19日(木) 19:58
by 御津凪
配列を直接弄る(元の文字列を破壊的に変更する)なら、
a[2] = '\0';
で、可能になります。
char buf[3] = {a[0],a[1],'\0'};
printf(buf);
とすることでも出来ます。
Re:文字列の配列
Posted: 2009年3月19日(木) 20:22
by TOMONORI
cout << a[0] << a[1];
とかかな。あまり実用的ではないですが・・・
Re:文字列の配列
Posted: 2009年3月19日(木) 20:24
by 昴
回答ありがとうございました。
よく、わかりました。
この文字列上にある'愛'と'る'を交換するにはどうしたらよいでしょうか?
文字の表現が1バイトだったら、
例えば、下記のように'a'と'c'を交換すると
char a[4] = "abc";
char temp = a[1];
a[1] = a[2];
a[2] = temp;
となりますよね。
でも、全角文字を扱う場合は半角文字と違って、a[0]='愛'はできないですよね。
Re:文字列の配列
Posted: 2009年3月19日(木) 20:36
by フリオ
一例です。
#include <stdio.h>
int main(void)
{
char a[/url] = "愛している", b;
int i;
for(i = 0; a; i += 2) printf("%.2s\n", &a);
b = a[0];
a[0] = a[8];
a[8] = b;
b = a[1];
a[1] = a[9];
a[9] = b;
putchar('\n');
for(i = 0; a; i += 2) printf("%.2s\n", &a);
return 0;
}
Re:文字列の配列
Posted: 2009年3月19日(木) 21:33
by SCI
実装依存ですが、こんなこともできますね。
#include <stdio.h>
#include <wchar.h>
int main(void)
{
wchar_t str[/url] = L"愛している";
wchar_t wc;
setlocale(LC_CTYPE, "");
printf("%lc\n", str[0]);
printf("%ls\n", str);
/* 交換します */
wc = str[0];
str[0] = str[4];
str[4] = wc;
printf("%ls\n", str);
return 0;
}
Re:文字列の配列
Posted: 2009年3月19日(木) 21:42
by たかぎ
2バイトだとわかっているのであれば...
char a[12] = "愛している";
printf("%.2s\n", a);
でどうでしょうか?
Re:文字列の配列
Posted: 2009年3月19日(木) 21:43
by たかぎ
既に解決していましたね。
Re:文字列の配列
Posted: 2009年3月19日(木) 22:25
by 朽木
>char a[12] = "愛している";
>このとき、'愛'だけを表示させるにはどうしたら、よいですか?
とりあえず、'愛'は間違いです。シングルクオート(')は、その
文字コードの値にします。
そのため、L'愛'と、ワイド文字表記にした方が良いと思、、、ったんですがcharなんですよね。なんだろう。
次のあるプログラムの実行結果を見てください。
ADDRESS+ 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF NCSL
0x00000000 B4 C1 BB FA 00 .. .. .. .. .. .. .. .. .. .. .. ........... 1400
これは、scanf()で「漢字」をEUC-JPで入力し、それを16進数で表したものです。
要は、ABCを表示するときと一緒です。下記は、EUC-JPの場合の配置です。Shift-JISはまた異なります。
EUC-JPでは、0x00 から 0x7F までは1バイト長で表現されます。英数字、半角記号などはここに含まれます。
0x8E が出た場合、次のバイトが 0xA1 から 0xFE の間の値であれば、半角カタカナとなります。
0xA1 から 0xFE の間の値が出た場合、次のバイトが 0xA1 から 0xFE の間の値であれば、2バイト文字となります。
0x8F が出た場合、次と、その次のバイトが 0xA1 から 0xFE の間の値であれば、3バイト文字となります。
って、解決してましたね。@@・・・
文字を置き換える場合、2バイトから1バイト、1バイトから2バイトなど、必要な領域が変化する場合がありますので、
charで実装する場合、文字列置き換え時用の一時領域を確保することが必要になるかも知れません。
Re:文字列の配列
Posted: 2009年3月19日(木) 22:44
by たかぎ
> とりあえず、'愛'は間違いです。
間違いかどうかは処理系不明なので何ともいえません。
charが16ビット以上あるかもしれませんので。
Windows用の処理系でそんなのがあるのかどうか知りませんが...
でも、よく考えてみると、
> 全角文字は2バイトで表現されるので
とのことなので、char型には(何ビットであるかは別にして)収まらないということですね。
Re:文字列の配列
Posted: 2009年3月20日(金) 18:30
by 昴
解決しました。ありがとうございました。