• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:全角文字を含んだ文字の並びを逆順にするには?)

全角文字の並びを逆順にする方法とは?

YanenoSuzumeの回答

  • ベストアンサー
回答No.9

No.2 です。 No.7 のプログラムの訂正: #include <string.h> void rev_str(char *str) { char *p; char w; /*交換用ワーク*/ for (p=str; *p != '\0'; ++p) if ( is_2byte(*p) ) { w = *p; *p = p[1]; p[1] = w; ++p; /*抜けていました*/ } strrev(str); /*文字列の並びを char 単位で逆にするライブラリ関数*/ }

MetalLover
質問者

お礼

御指摘ありがとうございます。 では、修正して試させていただきます。

MetalLover
質問者

補足

上記の関数を試したところ、上手く行きました。 YanenoSuzumeさんには、何度も御回答いただき、大変助けられました。 本当にありがとうございました。

関連するQ&A

  • 全角文字のチェック

    現在C言語を勉強しております。 そこで、キーボードから入力された文字列のチェックを行う関数を作成したいのですが、実装方法が分かりません・・・。 以下に仕様と私の作成したソースを貼ります。 【許可する文字】は、 全角のひらがな 全角の英語(大文字も小文字もOK) 全角の数字 です。 チェックする関数を作成したいのですが、以下ではうまくいかず・・・ 教えてくださいorz 比較の仕方がおかしいのかな・・・とは思っているんですが。 関数は、引数として渡された文字列に許可以外の文字が含まれている場合は1を、そうでなければ0を返す、という仕様にしたいです。 int checkName(char *str) { int i; for(i = 0; str[i] != '\n'; i++){ /* 奇数バイトをチェック */ if(str[i] != 0x82){ return 1; }else{ i++; /* ひらがな以外の場合 */ if(str[i] < 0xa0 && str[i] > 0xf1) /* 英語(大文字)以外の場合 */ if(str[i] < 0x60 && str[i] > 0x79) /* 英語(小文字)以外の場合 */ if(str[i] < 0x81 && str[i] > 0x9a) /* 数字の場合 */ if(str[i] < 0x50 && str[i] > 0x58) /* 許可する文字に該当しなかった場合は1を返す */ return 1; } } return 0; } 上記ソースの「(str[i] != 0x82)」は比較の仕方としておかしいでしょうか? 以上、よろしくお願いいたします。

  • 全角文字の判定

    現在C言語を勉強しております。 そこで、キーボードから入力された文字列のチェックを行う関数を作成したいのですが、実装方法が分かりません・・・。 以下に仕様と私の作成したソースを貼ります。 【許可する文字】は、 全角のひらがな 全角の英語(大文字も小文字もOK) 全角の数字 です。 チェックする関数を作成したいのですが、以下ではうまくいかず・・・ 教えてくださいorz 比較の仕方がおかしいでしょうか? 関数は、引数として渡された文字列に許可以外の文字が含まれている場合は1を、そうでなければ0を返す、という仕様にしたいです。 int checkName(char *str) { int i; for(i = 0; str[i] != '\n'; i++){ /* 奇数バイトをチェック */ if(str[i] == 0x82){ i++; /* ひらがなの場合 */ if(str[i] >= 0xa0 && str[i] <= 0xf1) printf("ひらがな\n"); return 0; /* 英語(大文字)の場合 */ if(str[i] >= 0x60 && str[i] <= 0x79) printf("英語大\n"); return 0; /* 英語(小文字)の場合 */ if(str[i] >= 0x81 && str[i] <= 0x9a) printf("英語小\n"); return 0; /* 数字の場合 */ if(str[i] >= 0x50 && str[i] <= 0x58) printf("数字\n"); return 0; } return 1; } return 0; } 以上、よろしくお願いいたします。

  • 文字の並び替え

    今、全角文字と半角文字が混在した文字列の並び替えをしています。 また、皆様のお力をおかしください。 例:CBABD → ABBCD 色々調べて以下の関数を使うことはわかったのですが、これをどう使えば、並び替えることが出来るのかがわかりません。教えてください。 例があれば、とてもうれしいのですが・・・ int ZenkakuHantei(unsigned char c) { return (((c >= 0x81) && (c <= 0x9f)) || ((c >= 0xe0) && (c <= 0xfc))); }

  • JISの全角判定処理について

    お世話になっております。 C++初心者です。 今、JISの全角判定処理を作っているのですが、 フォームのイベントでKeyPressに関数をセットしてあるのですが、 関数のフォーマットが void *********(char &Key); ※[*]は任意の文字列 になっており、半角ならこの関数を1回通り、 全角なら2回通ります。(引数の変更はできません) そこで下記のような関数を作成しました。 void pressKeyFullPitch(char &Key){   static bool fullFlag = false;   if(fullFlag){     fullFlag=false;     Key='*'     return;   }   if( Key >= 0x81 && Key <= 0x9f) || (Key >= 0xe0 && Key <= 0xfc ){     fullFlag = true;     Key = '*';   }      } 全角で入力された2byte文字は2byteとも[*]にするようにしています。 ここて関数内にstatic boolを宣言していますが、 static変数は関数終了時にも値を保持しているため あまり使わないほうがいい気がするので質問させていただきます。 ※すいません、経験が少ないのでstatic変数について知識が足りないかもしれません。 この場合、static変数を使わずうまく処理できる方法が ありましたら、お願いします。

  • CString型 全角半角を意識せずに「1文字」ずつ取り出す

    CString型の文字列に格納されている文字を1文字ずつ取り出したいです。 ただし半角なら1バイト単位で、全角なら2バイト単位で、という風に分離したいです。 半角だけなら、str[0] str[1]...という風に取り出せますが、 全角が混じっていると、1バイト目、2バイト目と分離されてしまいます。 その文字が半角か全角かを判断して、半角なら1バイト、全角なら2バイト同時に取り出すロジックを、下記のような感じの関数として作りたいです。 CString ripString(CString str,int index){ //ソースとなる文字列、n文字目 /*~処理~*/ return 文字列; } たとえば"あaいbうcえdおe"という文字列を入れると、 CString str="あaいbうcえdおe"; ripString(str,0) →結果 "あ" ripString(str,1) →結果 "a" ripString(str,2) →結果 "い" ripString(str,3) →結果 "b"  ・  ・  ・   こういうことをするのに良い方法はありますか? 1バイトごとのそれぞれの文字自身が、 ・半角文字なのか ・全角文字の前1バイトなのか ・全角文字の後1バイトなのか これをプログラム的に判別する方法があればいいのですが・・・悩んでいます。

  • c言語の文字列の逆順のプログラムがわかりません

    文字列を逆順して出力するプログラミングがわかりません。 #include <stdio.h> #include <string.h> void reverse(char *moji, char *gyaku); int main(void) { char x[30]; char y[30]; puts("文字を入力してください。\n"); scanf("%s", x); reverse(x, y); printf("逆順すると%sです。\n", y); return (0); } void reverse(char *moji, char *gyaku) { int i, len; len = strlen(moji); gyaku = moji + len - 1; for(i = 0; i < len; i ++){ putchar((int)*gyaku); gyaku--; } } 理想とする実行結果は 文字を入力してください。 abcdefg 逆順するとgfedcbaです。 なんですが、 上記のソースを実行すると 文字を入力してください。 abcdefg gfedcba逆順すると(謎の漢字)です。 となります。 どこがおかしいんでしょうか? よろしくおねがいします。

  • VBで全角文字の上位コードを取得するには?

    今までC言語で以下のようなソースで動いていたプログラムがあります。 int main(void) {  FILE *fp1;  char str1[]="ABCあ"; char str2[]="XXX";  fp1 = fopen("aaaa.txt", "w");  fprintf(fp1, "%-4.4s%3s\n",str1,str2);  fclose(fp1); } 上のプログラムの実行結果は「ABC9XX」になります。 これは、printf関数で変数str1の4文字目が全角文字の「あ」であるのに %-4.4sが指定されているため、「あ」の上位コードと str2の1文字目のXの文字コードが連結されてしまい、 文字化けしてしまっているようです。 「ABCあ」の文字コード A=41H, B=42H, C=43H, あ=82H,AOH 「XXX」の文字コード X=58H, X=58H, X=58H 出力結果 ABC9XXの文字コード A=41H, B=42H, C=43H, 9=82H,58H, X=58H X=58H 今回このプログラムをVBに置き換えることになったのですが、 出力されるデータは今までプログラムとまるで同じにしてほしい (つまり、今まで文字化けしてるところは 文字化けした形で出力してほしい)の依頼があったため、 Format関数やLeftB関数を使って なんとかプログラムを書いてみたのですが、 うまく動作しません。 うまい対処法があれば教えてください。 宜しくお願いします。

  • プログラム

    文字列を逆順にする関数を作ってるのですがうまくできません。 void reverse(char *str, int count=0) { int i; char *s="momonga"; s+=strlen(s); count=strlen(s); for(i=count; i<0; i--, str++, s--){ *str++=*s++; } } int main() { char s1[20]; int c; reverse(s1,c); printf("%momongaを逆順にすると%sで文字数が%dです",s1,c); return 0; } このプログラムの間違ってる所をおしえてください。

  • 文字数の逆順

    C++で入力文字の文字数を関数を使って逆順にするにはどのようなプログラムを作ればよいでしょうか。 入力文字がabcd 文字数4個 4321と出力したい。

  • 漢字の第1バイト検証

    今、文字判定関数について勉強しているのですが、 unsingned char uch にgetchar()の値を入れ if(uch >= 0x81 && uch <= 0x9f || uch >= 0xe0 && uch <= 0xfc) とうコードで、なぜ漢字コードは「0x81~0x9f」と「0xe0~0xfc」の 二つの範囲があるのか解りません。 よろしくお願いします。