c++ で 大文字から小文字に変換する 行為をしたいのですが、


void Input::MakeLower()
{
for(unsigned int i = 0; i < strlen(nowline); i++)
{
if((nowline[i] >= GAG) && (nowline[i] <= GZG))
{
nowline[i] += GaG - GAG;
}
}
}
*/

これだと うまくいきません。 教えて下さい

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/10/22 10:56:45
  • 終了:--

回答(5件)

id:RC30-popo No.1

POPO回答回数345ベストアンサー獲得回数132005/10/22 11:20:04

ポイント30pt

http://www.lookuptables.com/

Ascii Table - ASCII character codes html octal hex decimal charts

URLはダミーです。

GAGとかGZGというのはソースコードそのままですか?

’a’ ’Z’の間違いでは?


あとnowline[]はcharの配列でしょうか?

中に入っているのはASCIIだけ?SHIFT JISとかだと別の配慮が必要になりますが。


そもそもどううまくいかないのでしょうか?

入力されている文字列と出力される文字列の例を示して貰えればもう少し情報が得られるかも。

id:tomomin555

CHARなんですぅ・・・;;

2005/10/22 11:36:20
id:aki73ix No.2

aki73ix回答回数5224ベストアンサー獲得回数272005/10/22 11:37:53

ポイント30pt

http://home.a03.itscom.net/tsuzu/programing/tips05.htm

文字列の全角、半角、かな、カナ、大文字、小文字の変換

通常は ' 'スペースで ORをとります


void Input::MakeLower()

{

  for(unsigned int i = 0; i < strlen(nowline); i++)

  {

    if((nowline[i] >= GAG) && (nowline[i] <= GZG))

    {

      nowline[i] |= ' '; //半角にするには 0x20引く

    }

  }

}


でも、これだと全角文字が間にあるととんでもないことになりますから

ちゃんと処理を入れるか、LCMapStringを使うことをお勧めします


LCMapString( GetUserDefaultLCID(), LCMAP_LOWERCASE, str1, lstrlen(str1);

id:tomomin555

ありがとうございます 試してみます。

2005/10/22 11:55:22
id:RC30-popo No.3

POPO回答回数345ベストアンサー獲得回数132005/10/22 11:45:24

ポイント30pt

やはり単純にGAGを’A’,GZGを’Z’,GaGを’a’にするだけに見えるんですが.....


void Input::MakeLower()

{

for(unsigned int i = 0; i < strlen(nowline); i++)

{

if((nowline[i] >= ’A’) && (nowline[i] <= ’Z’))

{

nowline[i] += ’a’ - ’A’;

}

}

}

id:tomomin555

CStringの中に

勝手にそういうことをやってくれる関数があるということを知りました。

CString::MakeLower ということで

これを やりたいのが 一番の目的です。

2005/10/22 12:06:15
id:aki73ix No.4

aki73ix回答回数5224ベストアンサー獲得回数272005/10/22 12:20:31

ポイント30pt

まだ解決されてないようなので

strlen(nowline)の中身を確認してみることをお勧めします

CHARの中にUNICODEなどのマルチ文字が入っていた場合、1文字目で処理が終わってしまいます


LCMapString( GetUserDefaultLCID(), LCMAP_LOWERCASE, str1, lstrlen(str1));

*さっきは最後の”)”を忘れていました

の場合も strlenを使ってしまうとマルチバイトなのを検出できずに strlen(nowline)=1になってしまうので処理が中座してしまいます


自前で処理するならmemcpyで一度wchar_t型にコピーして処理した方がよいかと思います(ここもstrlenは使わない)

http://www.hey-to.net/ML-archive/vcppML/1999/msg05078.html

[vcpp 00030226] VC++ $B%G%P%C%,$N;H$$J}(B(Re: UpdateAllViews$B$K$D$$$F(B)

VC++やC++.Netなら F9でブレークポイントをはって F5コマンドでデバッグを開始すれば F10でトレース実行できますから

ブレークポイントを入れて確認してみるとよいと思います

id:tomomin555

自分で勝手に作った inpMakeLower()って関数で

アルファベットを小文字化しています。

この自作inpMakeLower()ではなく、

CStringTの中のMakeLowerを使って小文字化したいと思っております。

文字列を実数化できる「atof()」みたいに

わざわざ今みたいに関数を作らなくても、勝手にやってくれるのがCStringTの中のMakeLower()だと思っています。

よりスリムにするためにもこれを使って、

今の自作inpMakeLower()を削除したいです。

さらにCStringTのTrim()も使いたいっす。

こういう状態です・・・・

2005/10/22 12:36:55
id:nitscape No.5

nitscape回答回数526ベストアンサー獲得回数02005/10/22 12:26:28

ポイント30pt

//nowlineがchar*なら。。。

if(1)

{

inti;

charnowline[256];


strncpy(nowline,”AAbbCC”,256);


//nowlineは”AAbbCC”


//変換部分

for(i = 0; i < strlen(nowline); i++)

{

if((nowline[i] >= ’A’) && (nowline[i] <= ’Z’))

{

nowline[i] += ’a’ - ’A’;

}

}


//nowlineは”aabbcc”になる

}


//nowlineがcharなら

if(1)

{

charnowline;


nowline = ’A’;


//nowlineは’A’


if((nowline >= ’A’) && (nowline <= ’Z’))

{

nowline += ’a’ - ’A’;

}


//nowlineは’a’

}


という感じで変換可能です。

実際に関数化する場合は、


BOOLMakeLower(char* pszLine)

{

inti;

intnLen;


if(pszLine == NULL)

returnFALSE;


//変換部分

nLen = strlen(pszLine);

for(i = 0; i < nLen; i++)

{

if((pszLine[i] >= ’A’) && (pszLine[i] <= ’Z’))

pszLine[i] += ’a’ - ’A’;

}


returnTRUE;

}


charMakeLower(char cbChar)

{

//変換部分

if((cbChar >= ’A’) && (cbChar <= ’Z’))

cbChar += ’a’ - ’A’;


returncbChar;

}

という感じにして、使うときは

//char*の場合

char pTest[256];

strncpy(pTest,”AAbbCC”,256);

MakeLower(pTest);

//charの場合

charcc;

cc = ’A’;

cc = MakeLower(cc);

という感じで使うといいと思います。

id:tomomin555

本当みなさま どうもありがとうございます。

頑張ってみます。

2005/10/22 18:04:56

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません