• ベストアンサー

C言語での文字の連結

こんにちは。 C言語で困っているので、どなたかご教示お願いいたします。 char buff[16]に「東京」(JIS)という文字の16進表示の文字列が格納されており、 その先頭にJISコードの始まりである = 1B2442(0x1B2442) をつけたいのですが、 連結の仕方がわかりません。 最終的に使いたいのはJISコードの始まりが連結されたbuffです。 すみませんが、教えてください!

noname#229153
noname#229153

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

  • ベストアンサー
  • ky072
  • ベストアンサー率60% (85/140)
回答No.1

こんな感じでいかがでしょう。 memmove( buff + 3, buff, sizeof buff - 3 ); memcpy( buff, "\x1b\x24\x42", 3 ); 連結と言うよりは、後方にシフトして先頭3バイトを書き換える形です。 さらに末尾にASCIIモードに戻すESCシーケンスを追加する場合には、 strcat( buff, "\x1b\x28\x42" ); こんな感じでできます。 ※buff のサイズは無視しています。

noname#229153
質問者

お礼

回答ありがとうございます!!後方にシフトする考えは全く思いつきませんでした。。ぜひ試してみます。ところで、memcpyには"0x"はいらないのでしょうか?知識不足で申し訳ございませんが、教えてください。

その他の回答 (2)

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.3

ANo.2のboss_3rdさん、その回答はあんまりです。 char buff2[3] = 0x1B2442;の部分はコンパイルエラーになりますし、3バイト分しか確保していないbuff2[]に"東京"の文字列をstrcat()したらオーバーランします。

  • boss_3rd
  • ベストアンサー率0% (0/1)
回答No.2

char buff2[3] = 0x1B2442; strcat(buff2,buff); buff = buff2; とかではいけませんかね?

関連するQ&A

  • C言語の連結について

    C言語で文字列を文字列の後ろに連結させるのはstrcat()関数で出来ますが,int型で宣言した変数はどのようにして連結させればよいでしょうか?? 1回文字列に変換してから連結させる方法しかないのでしょうか??

  • Cでは文字列をどのように認識するのでしょうか?

    C言語には文字列型というものは存在しないと教わりました。 文字列の終わりはヌル文字で認識できますが、 文字列型というものが存在しないのに何故次のバイトを読もうとするのですか? たとえばchar str[] = "abc";、あるいはchar *p = "abc";とあったとして printf(str);あるいはprintf(p); でなぜabcが出力されるのでしょうか?なぜaの次にbがbの次にcがあるとわかるのでしょうか? char型で先頭アドレスが渡された場合、ヌル文字を見つけるまでアドレスをインクリメントし続けるという決まりでもあるのでしょうか? それに文字列型というものが存在しないなら''と""を分ける意味もないのでは??

  • C言語で文字列をかえす正しい書き方が知りたいです?

    C言語で次の警告が表示されます。 文字列を返したいのですが、正しい書き方はどのようにすれば良いのでしょうか? jci.h(20) : warning C4172; ローカル変数またはテンポラリのアドレスを返します。 char *test(char *a, int b) { char str[BUFSIZ]; return str; <------ }

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

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

  • C言語についてアドバイスをください。

    CSVファイルの内容をfreadで読み込み、strtokを使わずにbuffに格納した後、 buffから1文字ずつbuff2へコピーさせていって、コンマがきたら数字、 改行がきたら名前と判別して、自作関数に渡して表示させたいです。 CSVファイルの内容は 『11,名前1(改行) 15,名前2(改行) 18,名前3』 といった感じです。 ------------------------------------------------------- #define _CRT_SECURE_NO_DEPRECATE 1 #include <stdio.h> #include <string.h> #include <stdlib.h> #define NUM 256 struct kou { short nenrei; char namae[30]; }; void pri(struct kou *o) { printf("%d\n%s\n",o->nenrei,o->namae); } int main(void) { FILE *fp; // ファイルポインタ char buff1[NUM] = {0}; char buff2[NUM] = {0}; char *fname = "text1.csv"; // ファイル名を指定 short i = 0; int n = 0; struct kou p; fp = fopen(fname, "r"); if(fp == NULL) { printf("%sファイルをオープンできませんでした。\n",fname); } fread(buff, 1, NUM, fp); while(buff1[n] != NULL) { buff2[n] = buff1[n]; // buff2[0]からbuff1の中を一文字ずつコピーしていく。 if(buff2[n] == ',') // buff2に格納されていく中にコンマがきたら以下の作業を行う。 { i = (short)atoi(buff2); // char型からshort型への変換 p.nenrei = i; } if(buff2[n] == '\n') { strcpy(p.namae,buff2); // p.namaeにbuff2をコピー。 pri(&p); } n++; } fclose(fp); printf("ファイルをクローズしました。\n"); return 0; } ------------------------------------------------------- 今のままだと 『11 11,名前1 11 11,名前1 15,名前2』 という表示になってしまいます。 while 内で既に読み込んだ部分を読み込ませないよう(表示させないよう)にできたら良いと思うんですが、そういったやり方はあるのでしょうか? むしろやり方を変えたほうが良いでしょうか・・・。 まだC言語を学び始めて日が浅いので、色々間違っている部分もあると思いますが、 そういったことを含めてアドバイスをいただけたらと思います。 よろしくお願いします。

  • 文字列の反転

    こんばんわ。C言語初学者の者です。早速質問させてください。 (1) char a; aの中身には、アルファベット小文字の文字列が5個並んでいるとします。 その文字列を前後反転させるにはどうすればいいでしょうか? 例えばabcdeと並んでいる文字列をedcbaとする場合です。(キーボードからabcdeと打ち込んだとき、aにedcbaと格納させたいのです) (2) char a;   char b;  中身は文字列で、二つを合体させたい場合どうすればいいのでしょうか?  例えば aにはth 、bにはatと格納されている場合thatと繋げたいのです。  よろしくお願いします。

  • c言語 型変換について

    c言語 型変換について 下記のように文字コードは、unsigned int型('B')をunsigned char 型(str[1] ) 格下げする型変換する規則を教えてください。 *質問ソースプログラム: int main(void) { char str[4]; /* 文字列を格納する配列 */ str[0] = 'A'; /* 代入 */ str[1] = 'B'; /* 代入 */ ・・・・・・ printf("size B %u\n",(unsigned)sizeof('B')); printf("size str[1] %u\n",(unsigned)sizeof(str[1])); * 実行結果 size B 4 size str[1] 1

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

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

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

    数日前に「http://okwave.jp/qa4903738.html」で質問させてもらった者です。 前回、寝起きでボケてるうちに回答を締め切ってしまって、 回答してくださった方との対話ができていませんでした。 すみません。 今回は前回の指摘された部分を含めて回答を戴きたく投稿させてもらいます。 質問内容はほぼ変わりありません。 CSVファイルの内容をfreadで読み込み、strtokを使わずにbuffに格納した後、 buffから1文字ずつbuff2へコピーさせていって、コンマがきたら数字、 改行がきたら名前と判別して、自作関数に渡して表示させたいです。 あと、fgetsは使わないようにしたいです。 CSVファイルの内容は 『11,名前1(改行) 15,名前2(改行) 18,名前3』 といった感じです。 ----------------------------------------------- #define _CRT_SECURE_NO_DEPRECATE 1 #include <stdio.h> #include <string.h> #include <stdlib.h> #define NUM 256 struct kou { short nenrei; char namae[30]; }; void pri(struct kou o) { printf("%d\n%s\n",o.nenrei,o.namae); } int main(void) { FILE *fp; // ファイルポインタ char buff1[NUM] = {0}; char buff2[NUM] = {0}; char *fname = "text1.csv"; // ファイル名を指定 int n = 0; struct kou p; fp = fopen(fname, "r"); if(fp == NULL) { printf("%sファイルをオープンできませんでした。\n",fname); return 1; } fread(buff1, 1, NUM, fp); // ここでファイルの内容が全てbuffに入る。 // printf("%s\n",buff1); // buff1にファイルの内容が書き込まれているか確認する。 while((buff2[n] = buff1[n]) != NULL) // buff2[0]からbuff1の中が終わるまで一文字ずつコピーしていく。 { if(buff2[n] == ',') // buff2に格納されていく中にコンマがきたら以下の作業を行う。 { p.nenrei = atoi(buff2); // char型からshort型への変換し、p.iAgeに入れていく。 } if(buff2[n] == '\n') { strcpy(p.namae,buff2); // p.namaeにbuff2をコピー。 pri(&p); } n++; } fclose(fp); printf("ファイルをクローズしました。\n"); return 0; } ----------------------------------------------- 前回指摘されたwhileの条件式ですが、 まだchar型とポインタを比べてることになっているので正しくないんですよね? 正直、どうすればいいかわかりません。 あと、今のままでは名前3の後が改行ではないので表示されることないですよね・・・。 どうすれば表示されるようになるでしょうか。 これも前回言われましたが while内の1つ目のif文の所で、カンマを処理したので次に取り込むbuff2への書き込み位置の変更というのもわかりません。 カンマが来た時点でbuff2[n]のnは2になっているんですよね? ということはbuff2[3]からまた読み込めたらいいということですよね? 厚かましくも立て続けに質問してしまって申し訳ありませんが回答を戴けたらありがたく思います。 宜しくお願いします。

  • SQL、oracleにて文字列操作(連結、切りだし)のパフォーマンス向上法

    oracle7を使用しています。 #desc a num  char(8) code char(2) seq char(2) ・・・ #desc b bango char(12) ・・・ 上記場合で aのnum,code,seq を結合したものと bのbangoが 同じかどうかの検索を外部結合付きで行いたいとします。 where bango(+) = num || code || seq で動作は正常に行われるのですが、検索速度がかなり重くなってしまいます。 文字列連結(||)は重くなるというのを聞いたことがあるのでできれば (||)を使用したくないのです。 where substr(bango,0,8) (+) = num and substr(bango,9,2) (+) = code and substr(bango,11,2) (+) = seq とすると外部結合のところでおこられちゃいました。 文字列連結をつかわずに上記SQLの検索パフォーマンス向上法を どなたか教えていただけませんか?

専門家に質問してみよう