文字列の配列

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

文字列の配列

#1

投稿記事 by » 15年前

こんばんは、いつもお世話になっています。
C言語は初心者で、現在テキストを参考にしながら進めています。
WindowsのVistaを使っております。

char a[12] = "愛している";
このとき、'愛'だけを表示させるにはどうしたら、よいですか?

全角文字は2バイトで表現されるので、printf("%c", a[0]);はおかしいです。

御津凪

Re:文字列の配列

#2

投稿記事 by 御津凪 » 15年前

配列を直接弄る(元の文字列を破壊的に変更する)なら、
a[2] = '\0';
で、可能になります。
char buf[3] = {a[0],a[1],'\0'};
printf(buf);
とすることでも出来ます。

TOMONORI

Re:文字列の配列

#3

投稿記事 by TOMONORI » 15年前

cout << a[0] << a[1];
とかかな。あまり実用的ではないですが・・・

Re:文字列の配列

#4

投稿記事 by » 15年前

回答ありがとうございました。
よく、わかりました。

この文字列上にある'愛'と'る'を交換するにはどうしたらよいでしょうか?

文字の表現が1バイトだったら、
例えば、下記のように'a'と'c'を交換すると
char a[4] = "abc";
char temp = a[1];
a[1] = a[2];
a[2] = temp;
となりますよね。
でも、全角文字を扱う場合は半角文字と違って、a[0]='愛'はできないですよね。

フリオ

Re:文字列の配列

#5

投稿記事 by フリオ » 15年前

 
 一例です。
#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;
}

 

SCI

Re:文字列の配列

#6

投稿記事 by SCI » 15年前

実装依存ですが、こんなこともできますね。
#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:文字列の配列

#7

投稿記事 by たかぎ » 15年前

2バイトだとわかっているのであれば...
char a[12] = "愛している"; 
printf("%.2s\n", a);
でどうでしょうか?

たかぎ

Re:文字列の配列

#8

投稿記事 by たかぎ » 15年前

既に解決していましたね。

朽木

Re:文字列の配列

#9

投稿記事 by 朽木 » 15年前

>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:文字列の配列

#10

投稿記事 by たかぎ » 15年前

> とりあえず、'愛'は間違いです。

間違いかどうかは処理系不明なので何ともいえません。
charが16ビット以上あるかもしれませんので。
Windows用の処理系でそんなのがあるのかどうか知りませんが...

でも、よく考えてみると、

> 全角文字は2バイトで表現されるので

とのことなので、char型には(何ビットであるかは別にして)収まらないということですね。

Re:文字列の配列

#11

投稿記事 by » 15年前

解決しました。ありがとうございました。

閉鎖

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