ID登録せずに、無料で質問できる♪ 教えて!gooアプリ>>

よろしくお願い致します。

CString型の文字の最後の1文字を’¥0’に変更するにはどうすれば良いのでしょうか?

CStringのことが良く分かっていないので、質問の仕方が変かも知れませんがお教えください。

今は仕方なしに、こんな感じでやってます。

CStringm_InputData;
char moji[100];
int n;

strcpy(moji,m_InputData);
n=strlen(moji);
moji[n-1]='\0'
m_InputData=moji;

A 回答 (8件)

最後の1文字を削除したいということでしょうか?



m_InputData.Delete(m_InputData.GetLength() - 1);

# 最後の1文字が漢字とかだとまずいですが。

参考URL:http://www.microsoft.com/JAPAN/developer/library …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

正確には最後から2文字以降を削除したいのですが、参考サイトを見てもすぐには理解できませんでした。

教えていただけると大変助かります。
どうかお願い致します。

お礼日時:2003/09/13 21:34

やりたいことはともかくとしてCStringを使っているのにメンバ関数を活かしてないような気がしますが。

CStringは文字列を扱うのに非常に便利ですからいくつか関数を覚えて使うようにすると良いと思います。

特定文字を置き換えるならこの場合はGetLength()で-2でも良いのかもしれませんが、Find()かReverseFind()あるいはFindOneOf()で見つけてSetAt()で置き換えるとか。

見つけた部分から前だけを抽出するならFind()で取ったnCountを使ってLeft()で抽出、=で代入するとか。

文字数を削るなら\0代入でなく、Mid()で割って=で代入するとか。

ホワイトスペース(空白、改行、タブ)を取り除くならTrimRight()を使うとか。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

お礼日時:2003/09/14 17:36

要はLFをCRLFに変換したいということですよね


変換は出来たみたいですが、一つ確認していただきたい
その読み込んでいるファイルの改行コードはLFなのですか?
Windows環境で使われるテキストファイルはCRLFが標準です。
しかしCでは伝統的に改行コードはLFなので、
WindowsのCにはCRLFをLFに変換して読み込む
「テキストモード」というのがあります。
テキストモードで読み込んでいませんか?

もしそうなら、何も変換せずに読み込む
「バイナリモード」でファイルをオープンすれば
うまくいくのではないでしょうか

fopenなら"r"ではなく"rb"を指定
CFileならCFile::typeBinaryを指定すればいいのかな?
(MFCはよく知らない)
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

お礼日時:2003/09/14 17:36

mydata1[n-1]='\0'; はfgets()の末尾の'\n'をカットするものですよね。


(厳密には'\n'かどうかの検査をすべきと思います)
http://www.bohyoh.com/CandCPP/C/Library/fgets.html

>空の1行を削除するために今回の処理をしています
取得した文字列に改行コードを付加しているので、最後は改行で終わりますね。
これでいかがでしょうか?

for(i=0;;i++){
 fgets(mydata1,256,fin);
 n=strlen(mydata1);
 if(mydata1[n-1]=='\n')
  mydata1[n-1]='\0';
 if(strcmp(mydata1,"end")){
  if(i==0)
   m_InputData=mydata1;
  else
   m_InputData=m_InputData+crlf+mydata1;
 }

}

参考URL:http://www.bohyoh.com/CandCPP/C/Library/fgets.html

この回答への補足

回答ありがとうございます。

教えて頂いたコードは理解できました。
しかしながら、実際にはテキストファイルに書き込むときに特殊な処理をしているため、教えていただいたコードではエディットボックスに表示するとゴミが付きます。
あああ
いいい・・  ←ゴミの数は適当

それで結局 moji[n-2]='\0' というおかしな処理が必要になりました。

MovingWalkさんのコードの考え方は、今後の参考にさせて頂きたいと思います。

また、最初の質問に戻って、今回知りたかったCStringでの処理の仕方については、yoppiiさんに教えて頂いたことで解決です。

今回の質問はこれで解決、終了にさせて頂きたいと思います。

#今回の質問の内容より前に行っているテキストファイルに書き込む処理を私自身が正確に理解出来ていない為、適確な質問が出来ず申し訳ありませんでした。
自分自身で調べて分からなければ、改めて質問します。
ちなみに、テキストファイルに書き込む時に以下のような感じで処理しています。
aaaa=aaaa+bb+"\x0a"+aaa+"\x0d\x0a"+"end"+crlf;

補足日時:2003/09/14 08:14
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

今日は疲れているのでもう寝ます。
(朝型タイプなのですみません)

教えていただいたことは明日また確認して連絡させていただきます。

一応、CStingでのコードは#5の補足に書いた方法でうまく行きました。
結果がうまくいっただけで、細かい分かっていない部分は勉強したいと思います。

お礼日時:2003/09/13 23:43

#3 のコードで「サンプルプログラムと同じ処理」


が出来るのですが。だめですか?

> 正確には最後から2文字以降を削除したいのですが、

もう一度やりたいことを確認したいのですが,
"ABCDE" が "ABC" になればいいのでしょうか?

日本語の扱いはどうしましょうか?
考慮しなくてもいいですか?
それとも,
"あいうえお" が "あいう" になって欲しいですか?

この回答への補足

参考サイトを調べてようやく出来ました。

m_InputData.Insert(m_InputData.GetLength() - 2, '\0');で同じことが実現でき、実行結果もうまくいきました。

補足日時:2003/09/13 23:31
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

適確に疑問点を質問できず、気を使わせて申し訳ありません。
#4のお礼欄にもう少し詳しく質問内容を書いておきました。

これでお分かりでしたら、よろしくお願い致します。

お礼日時:2003/09/13 22:39

>サンプルプログラムと同じことが出来れば良いです



何のためにサンプルプログラムのようなことが必要なのかをお聞きして
いるんです。サンプルプログラムのままがよければそれでいいはずです。

moji[n-1]='\0'
C文字列の最後の文字を消すってことですよね。

こうすれば、
「CString型の文字の最後の1文字を’¥0’に変更する」
ことになるんですか?(文字サイズが小さくなることとは意味が少し違います)

この回答への補足

すみません。1部訂正です。

<誤り>
あああ
いいい・

<訂正>
あああ
いいい
     ←空の1行が入る
|    ←カーソルの位置

空の1行を削除するために今回の処理をしています。

補足日時:2003/09/13 22:45
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>何のためにサンプルプログラムのようなことが必要なのかをお聞きしているんです。

うまく説明できませんがご容赦ください。

<仕様>
1.テキストファイルから1行づつ読み込む。
2.読み込んだ文字列をエディットボックスに改行して表示できるように、1行読み込む毎に"\x0a"を追加しました。
while(1){
   fgets(mydata1,256,fin);
   n=strlen(mydata1);
   mydata1[n-1]='\0';
   if(strcmp(mydata1,"end")){
     m_InputData=m_InputData+mydata1+crlf;
   }


3.実行してみると、最終行にだけゴミ・が付きました。

あああ
いいい・

4.そのゴミを取るために、次のようにしました。
CString m_InputData;
char moji[100];
int n;

strcpy(moji,m_InputData);
n=strlen(moji);
moji[n-2]='\0' //■n-2です
m_InputData=moji;

>サンプルプログラムのままがよければそれでいいはずです。
もう少しスマートな書き方があるんじゃないかと思いお聞きしました。

これでお分かりでしょうか?
よろしくお願い致します。

お礼日時:2003/09/13 22:33

結局何をしようとしているのかわかりませんが、


こちらを参考にしてみてはいかがでしょうか。
http://www.microsoft.com/japan/developer/library …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>結局何をしようとしているのかわかりませんが、
質問が仕方がまずいようですが、勘弁ください。

サンプルプログラムと同じことが出来れば良いです。

よろしくいお願い致します。

お礼日時:2003/09/13 21:07

'\0'は文字列の終わりを意味するコードなので、「文字」ではありませんし、文字列の一部として扱うことはできません。


CString型では内部で自動的に文字列の最後に'\0'が付加されています。

ご質問のサンプルプログラムでは、文字列が1文字少なくなるだけです。

この回答への補足

回答ありがとうございます。

サンプルプログラムと同じ処理が出来れば良いのですが、CString特有のもっと簡単な書き方ができるのでしょうか?

よろしくお願い致します。

補足日時:2003/09/13 21:01
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCStringのFindで文字列検索を行いたいのですが

こんにちは。
いつもお世話になっております。

CStringのFindメソッドで文字列検索を行っているのですが、文字列ではなくコードで検索が行われてしまい困っています。
-------------------------------------------------------

CString TargetStr;

TargetStr = "ハヒフヘホ";
if(TargetStr.Find("z", 1) != -1){
return FALSE;
}

-------------------------------------------------------

上記で文字"ホ"のコードが「837A」で"z"が「7A」のため、
文字列が存在するという結果が帰ってきます。
コードではなく文字そのものの検索をするにはどうしたらよいでしょうか?
基本的なことで申し訳ありませんが、ご教示下さい。

<環境>
Windows 2000, VC6.0

Aベストアンサー

CString::Findメソッドは、1バイトごとの検索を行うので、そのような結果になってしまいます。

このような処理を避けるには、CString::Findではなく、_mbsstrを利用します。
詳しくは、MSDNを参照のこと。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vclib/html/_crt_strstr.2c_.wcsstr.2c_._mbsstr.asp

どちらかといえば、_tcsstrを利用してUnicodeとMBCSの両方に対応できるようにしておいたほうがいいです。
#この場合、_UNICODEもしくは_MBCSのどちらかが設定されていないと正しく動きません。

*注意*
この関数はANSIに互換性がないようですので、Windows以外では利用できない可能性があります。


また、上記のような関数を使わず、自分で実装するなら、以下の参考URLを参考にしてください。

参考URL:シフトJIS文字列の文字検索

参考URL:http://katsura-kotonoha.sakura.ne.jp/prog/c/tip0002d.shtml

CString::Findメソッドは、1バイトごとの検索を行うので、そのような結果になってしまいます。

このような処理を避けるには、CString::Findではなく、_mbsstrを利用します。
詳しくは、MSDNを参照のこと。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vclib/html/_crt_strstr.2c_.wcsstr.2c_._mbsstr.asp

どちらかといえば、_tcsstrを利用してUnicodeとMBCSの両方に対応できるようにしておいたほうがいいです。
#この場合、_UNICODEもしくは_MBCSのどちらかが設定されていないと...続きを読む

QC++でのCRLFについて

VisualC++を使っています。

CStringを使ってテキストファイルに出力するのですが、
\r\nを入れると、2重に改行されるようなのです。

これはエディタの仕様によるのかもしれませんが、
メモ帳なら正常に改行されますが、NoEditorやExcelで開くと、
2重に改行されてしまいます。

\nにするとどのエディタでもうまくいきます。

WindowsではCRLFが改行ということで\r\nにしましたが、
どういうことなのでしょうか?
CStringの影響でしょうか?

Aベストアンサー

>CStringを使ってテキストファイルに出力するのですが、

どうやってファイルに出力していますか?

Cランタイムでテキストモードで出力…の場合にランタイム側で\nを\r\nで出力する。
という処理がされている場合があります。
# テキストモードで読み込むと\r\nが\nになる。ということも。
その場合に\r\nを出力すると\r\r\nと出力されることになります。
出力結果をバイナリダンプなどで確認してみてはどうでしょうか?

Windows内でも改行の扱いがそれぞれ異なる場合がありますので、その辺りは注意が必要かも知れません。
# コントロールに設定する時に改行が\r\nである必要があったり、\nだけでOKだったり…など。

QCString から LPCTSTRの型に変換

visual studio 2013 VC++を使用していますが、WINDOWSの関数に渡すためにCString からLPCTSTRに変換する必要があります。実際にどのようにするのかわかりません。
例えば、以下のサンプルは他の質問コーナーの回答をアレンジしたものです

CString str = _T("ABC");
int siz = str.GetLength()+1;
LPCTSTR pszFName = new TCHAR[siz];
_tcscpy_s( pszFName, siz, str );

で変換するのですが
LPCTSTRからwchar_t*へ変換できませんとエラーがでます
_tcscpy_s()は使用できないのでしょうか

Aベストアンサー

>APIはCStdioFile の Open()でファイル名を与えるところ

APIではないようですが……。

http://msdn.microsoft.com/ja-jp/library/ee247566.aspx
ならば、そのままCStringの変数渡せば、よろしく処理してくれると思いますけど。

QCStringの文字列検索&抜き出しについて

お世話になります。
///////////開発環境///////////
WinXP VisualStudio 2005 SDI MFC

以上の環境にてプログラムしています。

現在CString型の変数の中にある文字列操作について悩んでいます。

例えば、 CString Test(:program!~program@123.456 TEST :message);

このような内容が入ってるとします。
こんな時に例えばTESTを抜き出したい時にどうすればいいでしょうか?
なお、毎回TESTという文字列ではなくTEST2などの文字列が変わるもの
だとするとバイト数指定が出来なくて困っています。
バイト数指定しないでTESTのTのアドレスをGETしてそれを'\0'までを
切り抜くと:messageの部分まで取れてしまいます。
でもバイト指定が可変なので、出来ない・・。どうすればいいのでしょうか??
同様にmessageの部分も毎回変わっていてバイト数指定出来ません。
こちらの方は、文字列の最後から:を探していって:が見つかったらその
アドレスから'\0'までを切り出せばいいと思うのですが、もし
messageの部分に:mess:ageこういうメッセージが送られて来た時に、
:ageしか取れなくなり、本当はmess:ageを切り抜きたいのです。
せっかくMFCのCStringを使っているので、strtokやstr~などのC言語関数
は避けたいのですが、何かいい案ありますでしょうか??
ご教示宜しくお願いいたします。

お世話になります。
///////////開発環境///////////
WinXP VisualStudio 2005 SDI MFC

以上の環境にてプログラムしています。

現在CString型の変数の中にある文字列操作について悩んでいます。

例えば、 CString Test(:program!~program@123.456 TEST :message);

このような内容が入ってるとします。
こんな時に例えばTESTを抜き出したい時にどうすればいいでしょうか?
なお、毎回TESTという文字列ではなくTEST2などの文字列が変わるもの
だとするとバイト数指定が出来なくて困っています。
...続きを読む

Aベストアンサー

CStringクラスの持っているメソッドのFind と Mid を使う。

CStringT のメンバ (ATL/MFC)
http://msdn2.microsoft.com/ja-jp/library/abzc9989(VS.80).aspx
CStringT::Find (ATL/MFC)
http://msdn2.microsoft.com/ja-jp/library/hz2099kw(VS.80).aspx
CStringT::Mid (ATL/MFC)
http://msdn2.microsoft.com/ja-jp/library/b4c90k3d(VS.80).aspx

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

QVC++で文字列から任意の文字を削除するにはどうしたらいいですか?

VC++で文字列から任意の文字を削除するにはどうしたらいいですか?
タイトルのとおりです。
VC++にてあるソフトのプロファイルを作成したいのですが、

[Profile]
Type = Default

となっており、Defaultという部分だけとりたいのです。
ちなみにDefault以外にもGuestやAdminなどもありますので、Type = まで取り出したいのです。

どうしたらいいんでしょうか?
よろしくお願いします。

Aベストアンサー

何がしたいかいまいちわかりませんが、
とりあえず文字列をCStringに一回入れてください。
右側を消したいならTrimRight
特定文字列まで取得したい場合は、FindとLeftとかで。


#include "afx.h"
#include <iostream>
int main()
{
CString str;// ここに文字列を入れる
CString dst;
dst = str = "type = default";
std::cout << str;
// 右側を削除
dst.TrimRight("default");
std::cout << dst << std::endl;
dst = str;
// =までを取得
dst = dst.Left(dst.Find('=')+1);
std::cout << dst << std::endl;

return 0;
}

Q文字列の置換をCStringで(C++)

あいうえお(5)かきく(8)けこ
という文字列の
”(数字)”を別の文字列”さささささ”
に変えたいんです。
(つまり、正解は
あいうえおさささささかきくさささささけこ)

replace関数を使ってみようと思ったのですが、
string型のものならば、
(開始場所、変えたい文字数、変えたい文字列)
を引数にすればいいのはわかるのですが、
これを、CStringでやりたいのです。
ヘルプを見てもCStringのreplace関数は
(変更前の文字列、変更後の文字列)を引数にする、
となっていて、私のように(数字)というアバウトな場合にはむかないのかとも思いますが、他のプログラムとの関係で、CString型がいいのです。

ややこしくてすいませんが、アドバイスお願いいたします。

Aベストアンサー

ごめんなさい。No.1のコードはボロボロですね。(括弧外の数字まで削ったりとか…)
なので改めて。でも、このやり方もいまいちな気がするな…
もっとスマートに処理したいと思ったら、正規表現ライブラリの利用になりますかね。

CString strSrc("あいうえお(5)かきく(8)けこ");
CString strNew("さささささ");

TRACE("%s\n", strSrc);
int nLeft = 0;
int nRigh = 0;
while ((nLeft = strSrc.Find('(', nLeft)) != -1) {
  if ((nRight = strSrc.Find(')', nLeft + 1)) == -1) {
    // 閉じ括弧無し
    nLeft++;
    continue;
  }
  // 括弧内の文字列を判定する
  int nCount = nRight - nLeft - 1;  // 括弧内の文字数
  int nMatch = 0;
  for (int i = nLeft + 1; i < nRight; i++) {
    if ('0' <= strSrc[i] && strSrc[i] <= '9') {
      nMatch++;
    }
  }
  // 括弧内が全て数字だった場合置換する
  if (nCount > 0 && nMatch == nCount) {
    strSrc.Delete(nLeft, nCount + 2);  // +2は括弧の分
    strSrc.Insert(nLeft, strNew);
    TRACE("%s\n", strSrc);
    nLeft += strNew.GetLength();
  } else {
    nLeft++;
  }
}
TRACE("%s\n", strSrc);

参考URL:http://www.s34.co.jp/cpptechdoc/article/regexpp/

ごめんなさい。No.1のコードはボロボロですね。(括弧外の数字まで削ったりとか…)
なので改めて。でも、このやり方もいまいちな気がするな…
もっとスマートに処理したいと思ったら、正規表現ライブラリの利用になりますかね。

CString strSrc("あいうえお(5)かきく(8)けこ");
CString strNew("さささささ");

TRACE("%s\n", strSrc);
int nLeft = 0;
int nRigh = 0;
while ((nLeft = strSrc.Find('(', nLeft)) != -1) {
  if ((nRight = strSrc.Find(')', nLeft + 1)) == -1) {
    // 閉じ括弧...続きを読む

Qfatal error LNK1120: 外部参照 1 が未解決です

またわからないことが・・・
教えて下さい。
以下をVC++2005でコンパイルすると、

MSVCRTD.lib(crtexew.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
C:\Documents and Settings\tomato\My Documents\Visual Studio 2005\Projects\a\Debug\a.exe : fatal error LNK1120: 外部参照 1 が未解決です。

と警告がでて通りません。
何のことでしょうか。

#include<stdio.h>
#include<process.h>

struct meibo{
  char name[20];
  char tel[20];
  char address[20];
};

void message( void );
void input( FILE *fp, int cnt , struct meibo *a, int *end );

void main( void )
{
  struct meibo a[20];
  FILE *fp;
  int cnt, end;

  if( (fp=fopen( "meibo.dat", "w" ) ) == NULL ){
    printf( "Can not open the meibo.dat.\n" );
    exit( 1 );
  }

  message();

  fprintf( fp, "番号, 名前, TEL, 住所\n" );
  fflush( fp );

  cnt = 0;
  end = 0;
  while( end == 0 ){
    input( fp, cnt, &a[cnt], &end );
    cnt++;
    fflush( fp );
    if( cnt == 20 ){
      printf( "人数が一杯です.終了します.\n" );
      end = 1;
    }
  }
  fclose( fp );
}

void message( void )
{
  printf( "名前, TEL, 住所, endを入力してください.\n" );
  printf( "継続の時はend=0," );
  printf( "中止の時は,end=1と入力してください.\n" );
}

void input( FILE *fp, int cnt, struct meibo *a, int *end )
{
  printf( "名前-->" );
  scanf( "%s", a->name );
  printf( "TEL -->" );
  scanf( "%s", a->tel );
  printf( "住所-->" );
  scanf( "%s", a->address );
  printf( "Exit? Continue:0 Exit:1 -->" );
  scanf( "%d", end );
  printf( "\n" );
  fprintf( fp, "%2d, %s, %s, %s\n",
    cnt+1, a->name, a->tel, a->address );
}

またわからないことが・・・
教えて下さい。
以下をVC++2005でコンパイルすると、

MSVCRTD.lib(crtexew.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
C:\Documents and Settings\tomato\My Documents\Visual Studio 2005\Projects\a\Debug\a.exe : fatal error LNK1120: 外部参照 1 が未解決です。

と警告がでて通りません。
何のことでしょうか。

#include<stdio.h>
#include<process.h>

struct meibo{
  char name[20];
...続きを読む

Aベストアンサー

http://www.a.math.ryukoku.ac.jp/~hig/course/compsci2_2005/man/faq.html
にある現象と同じではないでしょうか、一度お試しください。

QCStringからchar*への型変換について教えてください。

以前の質問に

int型 → CString型/char型

がありましたが、

CString型をchar*型に変換する方法を
教えていただければありがたいです。

MSDNで「LPCTSTRキャスト」が説明されていましたが、
例が載ってないのでよくわかりませんでした。

よろしくお願いします。

Aベストアンサー

目的にもよりますが一時的にchar配列として使いたいならCString::GetBuffer()が利用できます。
char配列としての利用が終わったらCString::ReleaseBuffer()する必要がありますが。

直接CString内の文字列を扱う必要があるならCString::operator LPCTSTRで文字列ポインタが得られます。
ただし、CStringオブジェクトをいじると無効ポインタなる可能性があるので気をつけてください。

MSDNのMicrosoft Foundation Classリファレンス→CString→クラスメンバで確認してください。

QcharからLPTSTRへの変換方法

リストコントロールにchar型の変数の値を数値として表示させたいのですが、charからLPTSTRへの洗練された変換方法がよくわからないです。

char tempChar;
CString tempString;
tempString.Format("%s", tempChar);
LPTSTR lpsz = new TCHAR[tempString.GetLength()+1];
_tcscpy(lpsz, tempString);

こんなプログラムを考えてみたのですが、汚いような気がします。もっと簡単で洗練された変換方法はないのでしょうか?

Aベストアンサー

wsprintfを使ってはどうでしょうか?

char tmpChar = 100;//表示する数値
TCHAR buf[5];
wsprintf(buf, "%d", tempChar);


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング