• ベストアンサー

文字除去

こんにちは、 c/c++ 初心者です(PG経験はたっぷりです) やりたい事は、time(hh:mi:ss)文字列(string or char)から、コロンを除去するのですが、素敵な方法が思いつきません。 今は単純に、文字列のpositionを固定で指定してstrcatしてます、目的は果たせてましたが、、、 他に、素敵な方法はありましたら、ご教示ください。 文字列:16:24:55 を 162455 に編集する。

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★単純にコロン文字以外をコピーすればよい。 ・PG経験はたっぷりあるみたいですが、C/C++ のポインタは分かりますか?  ポインタを使って別領域にコロン以外の文字をコピーすれば簡単ですよ。  下にそのサンプルを載せます。 サンプル: char *coroncut( char buff[], const char string[] ) {  char *dest;    for ( dest = buff ; *string != '\0' ; string++ ){   if ( *string != ':' ){    *dest++ = *string;   }  }  *dest = '\0';  return buff; } その他: ・上記の関数の第一引数にコピー先領域を、第二引数に時間文字列を渡して下さい。  つまり、  char buff[ 16 ];    coroncut( buff, "16:24:55" );  と指定します。すると buff にはコロン文字以外の数字 162455 がセットされます。 ・以上。今後の参考に!

masa-it
質問者

お礼

早速の回答ありがとうございます。 ポインタをずらして行って、 notの場合だけコピーするのですね。C言語っぽいですね。 ※なぜか、殆どこのままソースに移植したら除去できませんでした。。。 :が;でした。。。自分、目があまり良くないので、違うことにきずくまで、しばらく掛かりました。(・o・) ありがとうございました。

その他の回答 (2)

  • DT200
  • ベストアンサー率38% (63/164)
回答No.3

こんな感じでどうでしょう void rmcolon( char *str ) {   char *p;   p = str;   while( *str != '\0' ){     if( *str != ':' ){       *p = *str;       p++;     }     str++;   }   *p = '\0'; }

masa-it
質問者

お礼

早速の回答ありがとうございます。 ポインタをずらして行って、 notの場合だけコピーするのですね。C言語っぽいですね。 ありがとうございます。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★追記。 ・スペルミスしてしまいました。  間違い⇒coroncut  正しい⇒coloncut  でした。

関連するQ&A

  • 日付をVARCHAR2型でYYYYMMDDと表示したい

    DATE型(YYYY/MM/DD HH24:MI:SS)の値を取り出し、 VARCHAR2(8)型の文字列YYYYMMDDにしたいと思っています。 TO_CHAR(DATE型,'YYYYMMDD')としても、YY-MM-DDと表示されてしまいます。 YYYYMMDDと文字型で表示させるにはどうすればよいのでしょうか。 宜しくお願い致します。

  • 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++のソースへ渡す方法が分からないです。 アドバイスいただけるとありがたいです。 簡単な例を頂けると更に大変ありがたいです。 以上どうぞ宜しくお願い致します。

  • strcat関数のオーバーフロー回避について

    C言語を勉強中の者です。開発環境はWindows7 Visual Studio 2010です。 2つの文字列を入力し、strcat関数を用いて文字列を結合、出力するプログラム を作成しています。文字列は1つの配列につき最大半角5文字です。 本来であれば、char st1[11];ではなく、char st1[6]; としたかったのですが、char st1[6];とすると、strcat関数を実行した際に バッファオーバーフローによるエラーが出てしまいます。 この様な時に、もっと合理的なコードの書き方があれば教えていただけないでしょうか。 よろしくお願いします。 #include <stdio.h> #include <string.h> void main(void) { char st1[11]; char st2[6]; printf("文字列(5文字以内)"); scanf("%s", st1); printf("文字列(5文字以内)"); scanf("%s", st2); strcat(st1, st2); printf("%s", st1); }

  • C++の問題で・・

    C++の問題で・・ 参考書に「簡易的な文字列クラスStringを作成せよ。」という問題があり作りました。 いかにそのコードを示します。今回の質問の内容に関係ないとおもうところや、インクルードなどは省かせていただきます。 環境は Visual studio 2008です。OSはXPです。 class String{     int len; //文字列の長さ     char *s; //文字列の先頭文字へのポインタ public:     String(const char *);     int length()const{return len;} //長さを求める     operator const char * ()const{return s;}     bool operator==(String &a)const{return strcmp(this->s, a);}     char *operator+(String&)const; }; char * String::operator +(String &a)const {     char *memory = new char[this->len + a.len + 1];     memory[0] = '\0';     return strcat(strcat(memory, this->s), a); } String::String(const char *p): s(const_cast<char *>(p)), len(strlen(p)){} String::String(const String &x) {     s = x.s;     len = x.len; } inline std::ostream& operator<<(std::ostream &s, String &x) {     return s << static_cast<const char *>(x); } int main() {     String a("My name is Paul");     String b("My name is Paul");     String c("My name");     String d(" is Paul");     cout << "a = " << a << "\n";     cout << "b = " << b << "\n";     cout << "c = " << c << "\n";     cout << "d = " << d << "\n";     cout << "a == b " << (a == b) << "\n";     cout << "a == c " << (a == c) << "\n";     cout << "c + d = " << (c + d) << "\n"; }     このようなプログラムなのですが、上記の char * String::operator +(String &a)const {     char *memory = new char[this->len + a.len + 1];     memory[0] = '\0';     return strcat(strcat(memory, this->s), a); } ところで、 memory[0] = '\0'; を除くと文字列を出力した結果をみると、先頭にいらない言葉が入っています。 僕の場合は x9My name is Paul と表示されます。文字化け・・ではないのですが、ゴミのようなものが・・ どうしてこのようなことが起こるか、どこでゴミが入ってしまうのか教えてほしいです。 稚拙なプログラムで申し訳ないです。 もし、間違っている場所や、もっと簡単にかけるようなところがあれば、ご指摘いただくとありがたいです。 よろしくお願いします!

  • 文字列の連結

    ポインタ変数で宣言された3つ以上の文字列を連結したいのです。 そこで char *str1 = "Hello,"; char *str2 = "Mr."; char *str3 = "Brown."; char msg[100]; strcat(msg,strcat(str1,strcat(str2,str3))); printf(msg); としたがやっぱり駄目でした。 strcat(str2,str3)からして駄目なんだとはなんとなくわかるのですが どうしたら解決できるのかわかりません。 結果的には printf(msg); ->Hello,Mr.Brown. としたいのです。解決案をご教授いただけないでしょうか。 お願いいたします。

  • 文字型で入っている時間を合計する方法について

    プログラミング初心者です。Oracleを使っています。 現在、文字型で入っている時間(TIME)を合計して出す方法を考えています。 書式はHH24:MIであり、例えば08:30という風にテーブルには入っています。 これらの列を合計し、合計が160時間ならば160:00と出したいのですが、方法が分かりません。 SUMで合計が出せるようにTO_NUMBERに入れようとしたのですが、変換することができませんでした。 非常に初歩的な質問だとは思いますが、質問できる人がいないので、分かる方がいれば是非お願いします。

  • 文字列の途中に「0」がある場合の文字出力について

    C言語初心者です。宜しくお願い致します。 char ss[10]; /*【1】0ナシの文字列*/ strcpy(ss,"abcdefg"); printf("%s\n",ss); /*【2】0アリの文字列*/ strcpy(ss,"abc0efg"); printf("%s\n",ss); /*【3】0アリ(NULL文字アリ)の文字列*/ strcpy(ss,"abc\0efg"); printf("%s\n",ss); 【2】、【3】の文字列を最後(~fg)まで出力させるには、 どうしたら良いのでしょうか。 (0や¥0を、文字情報の一部として扱いたい場合、という意味です。) 宜しくお願い致します。

  • 文字列の中から必要なデータを抜き出す

    VC++6.0 です。 計測機器から受信したデータ(文字列)の中から、必要なデータだけを抜き出したいのですが、 うまく抜き出すことが出来ません。アドバイスいただけませんでしょうか? 受信する文字列は 伝送制御キャラクタSTX(0x02) "文字列" 伝送制御キャラクタETX(0x03) のように受信します。 抜き出すための目印?がキーボードで入力できるような文字列の場合は過去ログにありました以下のコードで 抜き出すことが可能でした。 抜き出すための目印を 0x02 や 0x03 にする為にはどうしたら良いでしょうか?   //文字列版 #include <stdio.h> #include <string.h> #include <stdlib.h> char *cut(const char *str, const char *ss, const char *es, char *buff){ /* str の ss の次から es の前までの文字列をbuff に切り出す */ char *wk, *s, *e, *c; wk=strdup(str); if(wk==NULL)return NULL; s=strstr(wk, ss); if(s==NULL){ free(wk); return NULL;} c=s+strlen(ss); e=strstr(c, es); if(e==NULL){ free(wk); return NULL; } *e='\0'; strcpy(buff, c); free(wk); return buff; } int main(void){ const char url[]="?http://www.sample.ne.jp/";? char buff[32]; printf("//~/:%s\n", cut(url , "//", "/", buff)); return 0; }

  • C#で文字列から数値だけ取得する方法

    C#で文字列から数値だけ取得する方法 stringの文字列をcharの文字配列に入れなおして 数値の場合だけ、別の配列(例:a[3])にコピーする。 そんな方法で数値を抜き出そうかと思っています ですが、文字列から数値だけを見つけ出して取得する方法がわかりません。 詳しくのっているサイトなどありましたら 教えてください…!!

  • ORA-01858: 数値を指定する箇所に数値以外の文字が指定されています

    <エラーメッセージの内容> ORA-01858: 数値を指定する箇所に数値以外の文字が指定されています 開発言語は、java,oracle10g express editionです スケジュールを登録する画面のところの日付のインサートで失敗します。「→」の部分です。 <以下のSQLをSQL/PLUSで実行するとうまくいきます> insert into schedule values(1, 1, '予定1', '予定1です', TO_DATE('2009-06-01 10:00','YYYY/MM/DD HH24:MI:SS') , TO_DATE('2009-06-01 12:00','YYYY/MM/DD HH24:MI:SS'), 'A社', '予定1のコメントです。',1); <問題のソースコード> * スケジュール情報をデータベースに新規保存する public void create(Schedule schedule) { String sql = "insert into " + SCHEDULE_TABLE_NAME + " (id, user_id,subject,content, start_time, end_time, place, comment1, is_publish) values(?,?,?,?,?,?,?,?,?)"; Connection con = null; try { con = createConnection(); con.setAutoCommit(false); int id = getNextId(con, SCHEDULE_TABLE_NAME); PreparedStatement stmt = con.prepareStatement(sql); →stmt.setString(5,toString(schedule.getStartTime())); →stmt.setString(6, toString(schedule.getEndTime())); * 日付を文字列表現(yyyy-MM-dd HH:mm)に変換する private String toString(java.util.Date date) { SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm"); →return "TO_DATE('"+"'"+sd.format(date)+"'"+",'YYYY/MM/DD HH24:MI:SS'"+")"; } ネット、本などでいろいろ調べましたが、わからなかったので、ヒントになることでもいいので、ご教授よろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう