C言語関係掲示板

過去ログ

No.217.文字列から指定文字列を消去したい


No.1338

文字列から指定文字列を消去したいんです
投稿者---さやか(2002/03/27 14:40:56)


ファイル名を付け替えるアプリケーションを作成してます。
たとえば、

ファイル名="A1bcABCeuABC"、
指定文字列="ABC"

としたとき、"A1bceu"という様に出力したいのです。
ファイル名の取得まではできたんですが、
文字列のサーチ、消去と、肝心の部分のコーティングがさっぱりです。
お分かりになる方、いらっしゃいましたらよろしくお願いいたします。

開発環境はWindowsXP+VC5.0です。


No.1340

Re:文字列から指定文字列を消去したいんです
投稿者---ともじ(2002/03/27 15:57:11)


こんにちは。

>ファイル名="A1bcABCeuABC"、
>指定文字列="ABC"
>
>としたとき、"A1bceu"という様に出力したいのです。

strstr関数を用いてこのような感じでいかがでしょう。

#include <stdio.h>
#include <string.h>
int main(void)
{
	char str1[128], str2[128];
	char str3[128] = "";
	char *p1 = str1, *p2;
	size_t len;
	
	printf("対象文字列の入力 ");
	scanf("%s",str1);
	printf("削除文字列の入力 ");
	scanf("%s",str2);
	
	len = strlen(str2);
	
	while((p2 = strstr(p1,str2)) != NULL) {	/* 削除文字列がなくなるまでループ */
		strncat(str3,p1,p2 - p1);		/* 削除文字列を除いて連結 */ 
		p1 = p2 + len;			/* ポインタの更新 */
	}
	strcat(str3,p1);
	printf("%s\n",str3);

	return(0);
}



No.1341

Re:文字列から指定文字列を消去したいんです
投稿者---B.Smith(2002/03/27 15:59:21)


こんにちは。

別の領域を確保して、そこへ削除対象以外の文字をコピーしていく等の方法も考えられますが、ここでは一つのバッファ内で、削除処理を行う方法をご紹介します。
関数strstrで文字列を検索し、発見した削除部分へ後続の文字列をかぶせるようにシフトします。
#include <string.h>

/* 文字列中の部分文字列を削除 */
void    DeleteString(char *pStr,char *pDelStr)
{
    int     DelLen,Length;

    DelLen = strlen(pDelStr);   /* 削除対象の長さ */

    while(pStr = strstr(pStr,pDelStr)){
        Length = strlen(pStr + DelLen);   /* シフトする文字列の長さ */
        memcpy(pStr,pStr + DelLen,Length);/* 文字列をシフトする   */
        *(pStr+ Length) = 0;              /* 末尾ヌル */
    }
}

pStrに文字列のポインタ、今回はファイル名を指定します。
pDelStrには削除文字列を指定します。

pStrには書き込み可能なバッファを指定しなければなりません。
    char  FileName[] = "A1bcABCeuABC";

    DeleteString(FileName,"ABC");




No.1342

Re:文字列から指定文字列を消去したいんです
投稿者---C職人(2002/03/27 16:02:43)


>こんにちは。
>
>別の領域を確保して、そこへ削除対象以外の文字をコピーしていく等の方法も考えられますが、ここでは一つのバッファ内で、削除処理を行う方法をご紹介します。
>関数strstrで文字列を検索し、発見した削除部分へ後続の文字列をかぶせるようにシフトします。
><PRE>
#include <string.h>

/* 文字列中の部分文字列を削除 */
void DeleteString(char *pStr,char *pDelStr)
{
int DelLen,Length;

DelLen = strlen(pDelStr); /* 削除対象の長さ */

while(pStr = strstr(pStr,pDelStr)){
Length = strlen(pStr + DelLen); /* シフトする文字列の長さ */
memcpy(pStr,pStr + DelLen,Length);/* 文字列をシフトする */
*(pStr+ Length) = 0; /* 末尾ヌル */
}
}
</PRE>
>pStrに文字列のポインタ、今回はファイル名を指定します。
>pDelStrには削除文字列を指定します。
>
>pStrには書き込み可能なバッファを指定しなければなりません。
><PRE>
char FileName[] = "A1bcABCeuABC";

DeleteString(FileName,"ABC");
</PRE>
>
#include <stdio.h>
#include <string.h>

int main(int argc,char *argv[])
{
char *p_head;
char *p;
char temp[256];
int foundCnt=0;

/*temp領域初期化*/
strcpy(temp,"");

/*引数の数チェック*/
if(argc != 3){
fprintf(stderr,"使用法:実行ファイル名 ファイル名 検索文字列\n");
return 1;
}

/*ファイル名の先頭アドレスを取得*/
p_head=argv[1];
p=argv[1];

while(1){
/*検索文字列をサーチ*/
p=strstr(p_head,argv[2]);
if(p==NULL){
if(foundCnt==0){
fprintf(stderr,"検索文字列[%s]は存在しません。\n",argv[2]);
}
break;
}

/*見つかったらカウントアップ*/
foundCnt++;

/*見つかった位置に文字列の終了マークを挿入する*/
*p='\0';

/*temp領域に見つかった直前の文字列を連結*/
strcat(temp,p_head);

/*ポインタを進める*/
p_head=p+strlen(argv[2]);

}

/*結果表示*/
if(foundCnt != 0){
printf("%s\n",temp);
}

return 0;
}
上記のように一行の中に複数検索文字列が存在する場合はstrstrを
使いまわせばできます。



No.1343

Re:文字列から指定文字列を消去したいんです
投稿者---さやか(2002/03/27 16:17:37)


strstr、なんて関数があったんですね。
さっそく作ってみようと思います。

ともじさん、B.Smithさん、C職人さん、
早いレスをいただき、本当にありがとうございました。


No.1347

Re:文字列から指定文字列を消去したいんです
投稿者---かずま(2002/03/27 20:10:20)


:        Length = strlen(pStr + DelLen);   /* シフトする文字列の長さ */
:        memcpy(pStr,pStr + DelLen,Length);/* 文字列をシフトする   */
:        *(pStr+ Length) = 0;              /* 末尾ヌル */
もう少し簡単になりますよ。

#include <string.h>

void deleteString(char *str, const char *del)
{
    char *p;
    int len = strlen(del);

    while (p = strstr(str, del))
        strcpy(p, p + len);
}

/* 以下、テストプログラム */
#include <stdio.h>

int main()
{
    char name[256], del[256];

    while (scanf("%255s%255s", name, del) == 2) {
        deleteString(name, del);
        puts(name);
    }
    return 0;
}



No.1351

Re:文字列から指定文字列を消去したいんです
投稿者---かずま(2002/03/28 00:29:01)


>void deleteString(char *str, const char *del)
>{
>    char *p;
>    int len = strlen(del);
>
>    while (p = strstr(str, del))
>       strcpy(p, p + len);
>}
訂正です。
void deleteString(char *str, const char *del)
{
    int len = strlen(del);

    while (str = strstr(str, del))
        strcpy(str, str + len);
}


No.1352

Re:文字列から指定文字列を消去したいんです
投稿者---さやか(2002/03/28 10:34:29)


キッチリしたものを完成することができました。
改めて4人の方々にお礼を申し上げます。
ありがとうございました。


戻る


「初心者のためのポイント学習C言語」 Last modified:2002.05.26
Copyright(c) 2000-2002 TOMOJI All Rights Reserved