【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.19058

永遠に続く文字列置換え
投稿者---KING OF POP(2005/01/06 14:44:06)


strXの値が'A'だった場合strに'B'を代入し、strXの値が'Z'だった場合はstrに'AA'を代入し
strXが'ZZ'だった場合は'AAA'を代入するといったように永遠に続くような文字列置換えをしたいのですが、
この場合は、下記のようにパターン分(といってもパターン分は無理)やるしかないのでしょうか?
プログラムでこれを実現可能にすることは可能でしょうか?
もし可能でしたらやり方をご伝授くださいませ。


if(strcmp(strX,"A")==0)
{
strcpy(str,"B");
}
if(strcmp(strX,"B")==0)
{
strcpy(str,"C");
}










この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:永遠に続く文字列置換え 19059 επιστημη 2005/01/06 15:03:40
<子記事> Re:永遠に続く文字列置換え 19061 Blue 2005/01/06 15:16:48
<子記事> Re:永遠に続く文字列置換え 19066 かずま 2005/01/06 16:42:50


No.19059

Re:永遠に続く文字列置換え
投稿者---επιστημη(2005/01/06 15:03:40)


>strXの値が'A'だった場合strに'B'を代入し、strXの値が'Z'だった場合はstrに'AA'を代入し
>strXが'ZZ'だった場合は'AAA'を代入するといったように永遠に続くような文字列置換えをしたいのですが、
> ...
>プログラムでこれを実現可能にすることは可能でしょうか?

struct pattern {
 char* before;
 char* after;
};

struct pattern[N];

なんてのを用意し、patternに納められたbefore/afterに基づいて行えばいいでしょう。

for ( i = 0 .. N-1 に対し ) {
 if ( pattern[i].before に一致 ) {
  pattern[i].after で置換する
 }
}




この投稿にコメントする

削除パスワード

No.19060

Re:永遠に続く文字列置換え
投稿者---KING OF POP(2005/01/06 15:11:23)


>struct pattern {
> char* before;
> char* after;
>};
>
>struct pattern[N];
>
>なんてのを用意し、patternに納められたbefore/afterに基づいて行えばいいでしょう。
>
>for ( i = 0 .. N-1 に対し ) {
> if ( pattern[i].before に一致 ) {
>  pattern[i].after で置換する
> }
>}
>

ありがとうございます。
恥ずかしながら難しくて理解できなかったんですが、これはbefore、afterをA〜Z分のパターン分記載するという意味でしょうか???



この投稿にコメントする

削除パスワード

No.19063

Re:永遠に続く文字列置換え
投稿者---επιστημη(2005/01/06 15:45:56)


>恥ずかしながら難しくて理解できなかったんですが、これはbefore、afterをA〜Z分のパターン分記載するという意味でしょうか???

YES. 置換前/後に一定の規則性があるなら、それを利用できるでしょうけど。
# 要は置換パターンの数だけ if 文をダラダラ書き連ねるのがイヤなんでしょ?



この投稿にコメントする

削除パスワード

No.19069

Re:永遠に続く文字列置換え
投稿者---επιστημη(2005/01/06 17:15:06)


>恥ずかしながら難しくて理解できなかったんですが、これはbefore、afterをA〜Z分のパターン分記載するという意味でしょうか???

え? つまり'A'..'Z' による26進数のカウンタが欲しかったわけ?
だとすると僕が提示した奴ではダメです。

# 仕様を'きっちり'定義/説明してくださいお願いだから。



この投稿にコメントする

削除パスワード

No.19071

Re:永遠に続く文字列置換え
投稿者---KING OF POP(2005/01/06 17:32:16)


仕様は

Aの次はB、Bの次はCでこの繰り返しでZまでいったらAAです。
AAの次はBBです。BBの次はCCです。
でZZまでいったら次はAAAです。
AAAの次はBBBです。

といった感じに永遠に増えていきます。

分かりにくい説明ですいません。。。


この投稿にコメントする

削除パスワード

No.19072

Re:永遠に続く文字列置換え
投稿者---επιστημη(2005/01/06 17:36:24)


>仕様は
>
>Aの次はB、Bの次はCでこの繰り返しでZまでいったらAAです。
>AAの次はBBです。BBの次はCCです。
>でZZまでいったら次はAAAです。
>AAAの次はBBBです。
>
>といった感じに永遠に増えていきます。

char X;
int n = 0;

for ( くりかえし ) {
if ( n == 0 ) { X = 'A'; n = 1; }
else { if ( X++ == 'Z' ) { X = 'A'; ++n; }
/* n個連続したX を作る。*/
}

これでいいのかしら?
あなたの説明をそのまま書き下せばこうなりますけど。





この投稿にコメントする

削除パスワード

No.19073

Re:永遠に続く文字列置換え
投稿者---επιστημη(2005/01/06 17:39:52)


>for ( くりかえし ) {
>if ( n == 0 ) { X = 'A'; n = 1; }
>else { if ( X++ == 'Z' ) { X = 'A'; ++n; }
>/* n個連続したX を作る。*/
>}

小さなバグがあります。



この投稿にコメントする

削除パスワード

No.19075

Re:永遠に続く文字列置換え
投稿者---nop(2005/01/06 18:00:59)


>Aの次はB、Bの次はCでこの繰り返しでZまでいったらAAです。
>AAの次はBBです。BBの次はCCです。
>でZZまでいったら次はAAAです。
>AAAの次はBBBです。
>といった感じに永遠に増えていきます。

え〜…と、
その調子で永遠に文字数が増えていったら、
メモリ容量以上の文字列になって、
理論上、実現不可能でしょう。

# 最も、オーバーするには結構な時間が掛かりそうですが…。

それより、何故そのような置換が必要なのでしょうか?


この投稿にコメントする

削除パスワード

No.19061

Re:永遠に続く文字列置換え
投稿者---Blue(2005/01/06 15:16:48)


文字列ではなく一文字一文字でASCIIコードかなんかで判定するのはどうでしょう?


一例
void Replace( char* strX )
{
    int nLen = strlen( strX );
    int nLoop;
    char cCheck;
    char cBefore = '\0';
    char szBuff[ 256 ];

    memset( szBuff, '\0', sizeof( szBuff ) );

    for ( nLoop = 0; nLoop < nLen; nLoop++ )
    {
        cCheck = strX[ nLoop ];
        
        if ( ( cCheck >= 'A' ) && ( cCheck <= 'Z' ) )
        {
            if ( ( cCheck == cBefore ) || ( cBefore == '\0' ) )
            {
                if ( nLoop == nLen - 1 )
                {
                    if ( cCheck == 'Z' )
                    {
                        memset( szBuff, 'A', nLen + 1 );
                    }
                    else
                    {
                        memset( szBuff, cCheck + 1, nLen );
                    }
                    strcpy( strX, szBuff );
                }
            }
            else
            {
                break;
            }
        }
        else
        {
            break;
        }
        cBefore = cCheck;
    }
}


まぁ これだとメモリ面で問題あるけどねw


この投稿にコメントする

削除パスワード

No.19077

Re:永遠に続く文字列置換え
投稿者---Blue(2005/01/06 18:31:38)


少しスマートにしてみました。
strXのメモリは考えていません。

void Replace( char* strX )
{
    int   nLen = strlen( strX );
    char* pszComp;
    char  cCheck = strX[ 0 ];

    if ( nLen == 0 )
    {
        return;
    }

    if ( ( cCheck < "A" ) || ( cCheck > "Z" ) )
    {
        return;
    }

    pszComp = ( char* )calloc( nLen + ( ( cCheck == "Z" ) ? 2 : 1 ), sizeof( char ) );
    memset( pszComp, cCheck, sizeof( char ) * nLen );
    if ( strcmp( strX, pszComp ) == 0 )
    {
        if ( cCheck != "Z" )
        {
            memset( pszComp, strX[ 0 ] + 1, sizeof( char ) * nLen );
        }
        else
        {
            memset( pszComp, "A", sizeof( char ) * ( nLen + 1 ) );
        }
        strcpy( strX, pszComp );
    }
    free( pszComp );
}




この投稿にコメントする

削除パスワード

No.19078

Re:永遠に続く文字列置換え
投稿者---Blue(2005/01/06 18:33:40)


変換ミスってました。

"→' です。




この投稿にコメントする

削除パスワード

No.19066

Re:永遠に続く文字列置換え
投稿者---かずま(2005/01/06 16:42:50)


> strXの値が'A'だった場合strに'B'を代入し、strXの値が'Z'だった場合はstrに'AA'を代入し
> strXが'ZZ'だった場合は'AAA'を代入するといったように永遠に続くような文字列置換えをしたいのですが、
仕様が不明確です。AA の次は何ですか?

A, B, ..., Z, AA, AB, ..., AZ, BA, BB, ..., BZ, CA, ..., CZ, ...,
ZA, ..., ZZ, AAA, ... だとすると、

#include <stdio.h>
#include <string.h>

void advance(char *s)
{
    int i, len = strlen(s);

    for (i = len; --i >= 0; ) {
        if (++s[i] <= 'Z') return;
        s[i] = 'A';
    }
    memmove(s + 1, s, len + 1);
    s[0] = 'A';
}

int main(void)
{
    char str[256];

    while (printf("> "), scanf(" %[A-Z]", str) == 1) {
        advance(str);
        puts(str);
    }
    return 0;
}

文字コードが EBCDIC の場合、このプログラムは正しくありません。
質問するときは、環境を明示してください。



この投稿にコメントする

削除パスワード

No.19068

Re:永遠に続く文字列置換え
投稿者---かずま(2005/01/06 16:54:36)


advance() の最後の s[0] = 'A'; は不要です。

さらに、memmove() も無駄なので、次のように変更します。

void advance(char *s)
{
    int i, len = strlen(s);

    for (i = len; --i >= 0; s[i] = 'A')
        if (++s[i] <= 'Z') return;
    s[len] = 'A';
    s[len+1] = '\0';
}



この投稿にコメントする

削除パスワード

No.19070

Re:永遠に続く文字列置換え
投稿者---KING OF POP(2005/01/06 17:29:46)


>>仕様が不明確です。AA の次は何ですか?

AAの次はBBです。BBの次はCCです。
でZZまでいったら次はAAAです。
AAAの次はBBB

といった感じに永遠に増えていきます。




この投稿にコメントする

削除パスワード

No.19074

Re:永遠に続く文字列置換え
投稿者---かずま(2005/01/06 17:41:15)


> AAの次はBBです。BBの次はCCです。
> でZZまでいったら次はAAAです。
> AAAの次はBBB
>
> といった感じに永遠に増えていきます。
仕様が少し明確になりましたね。文字コードは不明ですが。

AB の次は、というような入力データはないと考えてよいのなら、

void advance(char *s)
{
    int n = strlen(s);

    if (s[0] != 'Z')
        memset(s, s[0]+1, n);
    else {
        memset(s, 'A', n+1);
        s[n+1] = '\0';
    }
}



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧