• ベストアンサー

C言語において2バイト文字を検出するには?

こんにちは。 C言語において、char型ポインタが指している文字が、2バイト文字の1バイト目かどうかを確認する事ができれば、文字列から2バイト文字を検出できると思うのですが、やり方が分かりません。 検索してみても、ややこしい事ばかり書かれていて、すっきりとした答えが見つかりませんでした。 何かいい方法を知っておられる方がいらっしゃれば、是非アドバイスを頂きたいと思います。 では、よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1622/5659)
回答No.2

文字コードが何か書かれていないのでShift_JISと仮定しますが その「ややこしい事」を理解してください。 Shift_JISは無理矢理なコード体系なのでマルチバイト文字の 1バイト目や2バイト目を簡単に確認する手段はありません。 char型ポインタが指しているもので判定できるのは 「1バイト目かもしれない」「2バイト目かもしれない」くらいです。

MetalLover
質問者

お礼

御回答ありがとうございます。 wormholeさんは、 http://okwave.jp/qa/q6996802.html の質問にも答えて下さっていますね。 そちらの方が、今回の質問よりもより具体的なので、 そちらで引き続きよろしくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • wormhole
  • ベストアンサー率28% (1622/5659)
回答No.3

補足ですがVisualC++であれば_mbsbtype()で調べることはできます。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「2バイト文字」って何?

MetalLover
質問者

お礼

全角文字(2バイトで表される文字)の事です。

MetalLover
質問者

補足

記述するのを忘れていましたが、文字コードはShift_JISです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語で取得した文字列を、C++の文字列として取り扱いたいです。

    C言語で取得した文字列を、C++の文字列として取り扱いたいです。 皆さんこんにちは。 C言語で取得したchar型で定義された文字列を、 C++の「std::string」に渡したいと思っております。 どうすればかなうでしょうか? 具体的には次のような内容です。 ■C言語側 ---- char key1 = "deperture"; ---- ■C++側で「key1 = key2」としたいです。 ---- std::string key2 = key1; ---- C言語側で記述されている「key1」の値(deperture)を、 C++ソース内の「key2」に渡したいと思っています。 こうゆう場合、どんな方法をとれば適切でしょうか。 C言語側でのchar型の文字列の値を、 C++側の「std::string」型として C++のソースへ渡す方法が分からないです。 アドバイスいただけるとありがたいです。 簡単な例を頂けると更に大変ありがたいです。 以上どうぞ宜しくお願い致します。

  • C言語の文字列について

    C言語で文字列のヌルについて、理解があいまいな点があり、教えて欲しいのですが、以下のようにsprintfで書式し代入した際に最後は0(ヌル文字)をセットしてくれるのでしょうか?4バイト目の文字が何か知りたいです。 char temp[100];時では0で初期化されていることは保障されていませんが、大抵は0で埋まっていますが、sprintfの仕様が知りたいです。 char temp[100]; sprintf(temp, "test");とした時に 01234バイト目 test?????????????.... 話は変わりますが、以下のようにするとエラーになりましたが、 特定の位置の値をセットする方法はどのようなものがあるのでしょうか? temp[10] = (temp[10] == '0') ? (char)'1' : (char)'0';

  • 文字列strの中から文字cを探すプログラム(C言語)がわからない

    文字列strの中から文字cを探すプログラム(C言語)がわからない 柴田望洋さんの「[新版]明解C言語」という本の演習11-2なんですがどうしてもわかりません。間違いは無いと思うのにコンパイルすると警告を吐かれます。 僕が書いたプログラムを載せます。 /* 文字列strの中に、文字cが含まれていれば(複数ある場合は、最も先頭側とする)、 その文字へのポインタを返し、含まれていなければNULLを返す関数 char *str_chr(const char *str, int c) {} を作成せよ。 */ #include<stdio.h> char *str_chr(const char *str, int c){ while(*str){ if(*str==c) return str; str++; }     return NULL; } int main(){ char *str; char c; scanf("%s",str); scanf(" %c",c);     printf("%d",str_chr(str,c)); return 0; } コンパイラは「関数str_chrのif分の中のreturn strの型変換に問題がある」と言っているんです。 型変換はしるつもりは無いのにコンパイラはなぜそのように認識するのでしょうか。 またネット答えを探しましたがどうやらこのreturn strの部分はreturn (char*)strが正解のようです。意味がわかりません。strはポインタなのになぜまたわざわざchar型に変換しているのですか?といか(char*)の意味が根本的にわかりません。 質問ばかりですみません。初心者でポインタがどうにも理解できないんです。 誰か詳しい人教えてください。 お願いします。

  • C言語について教えてください。

    #include <string.h> #include <stdio.h> void print_all_char(char *str) { while(*str! = '\0') { printf("%c\n", *str); str++; } } int main(void) { char astr[5]; char *pstr; strcpy(astr, "ABCD"); pstr = "EFGHI"; puts("「配列で実現する文字列」を表示する"); puts(astr); puts("「配列で実現する文字列」のすべての文字を表示する"); print_all_char(astr); puts("「ポインタで実現する文字列」を表示する"); puts(pstr); puts("「ポインタで実現する文字列」のすべての文字を表示する"); print_all_char(pstr); return 0; } 自分でつくった上のプログラムではエラーが発生します。 なぜだか分かりません。教えてください。 ちなみに、実行結果は 「配列で実現する文字列」を表示する ABCD 「配列で実現する文字列」のすべての文字を表示する A B C D 「ポインタで実現する文字列」を表示する EFGHI 「ポインタで実現する文字列」のすべての文字を表示する E F G H I のようにしたいです。 よろしくお願いします。

  • C言語 ポインタ型引数の呼び出しについて

    C言語 ポインタ型引数の呼び出しについて 私が作成したのではないのですが下記のような関数があります。 この関数は文字列を渡すとカンマ(,)で分割して返してくれる関数 らしいのですが、使用方法がわからず、こまっています。 char* abcdef(char** p) 当方としては下記のような変数定義を行っているのですが char cbuff[128]; //文字列(カンマを含めた) char *coutbuff[128]; //分割された文字列 理想としてはこんな感じで呼び出したいのですが strcpy(cbuff,"0,,123,45,6"); coutbuff=abcdef(cbuff); どのように呼び出したらよいかご教示願います。

  • 1バイト文字から2バイト文字に変換

    C言語にて Char a = "-"; 上記のような直打ちのASCII(1バイト文字)をUCS-2(2バイト文字)に文字コードを利用して変換する方法がわかりません。 わかる方がいらっしゃいましたら助けて頂けるとありがたいです。

  • C言語で、入力された、文字列を逆に並べるプログラム。

    タイトルのとおりのプログラムをつくりたいんです。 例えば、abcと入力したら、cbaと返してくれるものです。 条件として、ポインタを使えと言われています。 自分で書いたソースは、 0: #include<stdio.h> 1: char re(char *s); 2: main() 3: { 4: char s[10]; 5: gets(s); 6: re(s); 7: printf("%s\n",s); 8: } 9: 10: char re(char *s){ 11: char c[10]; 12: 13: c[9]=s[0]; 14: c[8]=s[1]; 15: c[7]=s[2]; 16: c[6]=s[3]; 17: c[5]=s[4]; 18: c[4]=s[5]; 19: c[3]=s[6]; 20: c[2]=s[7]; 21: c[1]=s[8]; 22: c[0]=s[9]; 23: 24: return c[10]; } C言語を勉強し始めたばかりで、なかなか思うようにかけないでいます。 文字列を入力するのは、4行目~7行目で大丈夫だと思うんですよ。 文字列を逆に並べる、関数 re(char *s)を作れずにいます。 配列s[10]に入っている、文字を最後から取り出して、c[10]にいれていけば、ひっくり返ると思っているんですが、作れません。 13行~21行目の作業も、whileかforでループさせるべきなのもわかってるんですが、条件をどうしたらいいか分からずに作れずにいます。今のソースのまま実行しても、入力したまま出力してしまいます。 さらに、ポインタも今日はじめて勉強して、うっすらと知ってるくらいなので、アドレスとかが、イメージできないでいます。 ながくなってすいません。アドバイスいただきたいです。よろしくおねがいします。

  • C++言語で文字列を出力するにはどうしたら良いですか。

    C++言語で文字列を出力するにはどうしたら良いですか。 今、ポインタの勉強中ですが、ポインタの使い方がよく分からないです。 次のコードで ---------- one two three ---------- を出力したいのですが、nしか出力できません。 どうやらoneのnしか出力できません。 どのようなコードを書いたら解決できますでしょうか。 ------------------------------------------- #include<iostream> using namespace std; char name[3][10]={{"one"},{"two"},{"three"}}; char f(const char *name,int i){ return name[i]; } int main(){ cout << f(name[0],1) << endl; } -------------------------------------------

  • エクセルのMID関数は、C言語では?

    最近C言語を始めたものです。 エクセルでは文字列の3文字目~5文字目を切り取る際に MID("文字列",3,2) と記述できますが、C言語の場合、はどのような記述方法になりますか?ご教授お願いいたします。 いま悩んでるのが、CHAR型の変数:aaaに"abcdefghi"を格納して、 aaaの3文字目~7文字目を抜き出したいというC言語での方法です。

  • C言語:小文字を大文字に変換する関数を作成

    C言語超初心者です。学校の課題で次のような問題が出されました。 ・問題・ 次に挙げる縛りに沿い、以下の関数とメイン関数を作り、処理結果を画面に作成しなさい。 char *tst(char *str) ・strの中の文字列も小文字を大文字に変換し、変換した文字列が格納されているchar *に返す。 ・引数strの中の文字列は受け取った状態で手を加えない。 ・関数内でmalloc関数を使用し、領域を確保して大文字に変換した文字列を格納しreturnでポインタを返す。 ・malloc関数を使用する。 ---------------------------------------------------------------------------------- 大文字に変換するには while(*str != '\0') { if(*str >= 'a' && *str <= 'z') { *str -= 'a'- 'A'; } ++str; } というのは分かったのですがここから何をすするか全く分かりません。初心者なのでなるべく分かりやすく教えてもらえると有難いです。 お願いします。