0

私の入力文字列は

\\?\bac#dos&ven_bb&prod_open-v&rev_5001#1&7f6ac24&0&353020304346333030363338#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}

必要な出力は

bac\dos&ven_bb&prod_open-v&rev_5001\1&7f6ac24&0&353020304346333030363338_0

次のコードを書きましたが、機能していません...問題を解決するために助けが必要です。私の無知を許してください:)それを行うためのより良い効率的な方法があれば教えてください。

出力文字列のルールは次のとおりです。

2 番目の文字列では、「\」と「?」をすべて削除しています。.そして、どこに「#」が表示されているかを「\」に置き換えます。2 番目の文字列は文字 "{" が表示されるまでのみですが、末尾に "#" は含まれません。

ありがとう

int main() 
{
    char s[] = "\\?\bac#dos&ven_bb&prod_open-v&rev_5001#1&7f6ac24&0&353020304346333030363338#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}";
    char s1[] = {0};
    printf("OUtput string is : ");
    for(int i = 0; s[i] != '{'; i++)
    {
        if(s[i] != '\\' && s[i] != '?')
        {
            int j = 0;
            if(s[i] == '#')
            {
                s1[j] = '\\';
                continue;
            }

            s1[j] = s[i];
            j++;
        }

    }

    for(int i = 0; s1[i] != '\0'; i++)
    {
        cout<<s1[i];    
    }

    getch();
}
4

3 に答える 3

2

関数の使用を検討することをお勧めしstd::string::replace()ます。これに関するオンライン ドキュメントはたくさんあります。役立つ可能性があるため、提供する必要がある他の機能のいくつかを見てみましょうstd::string。C++ を使用している場合は、通常、配列やインデックスstd::stringをいじるよりも を使用することをお勧めします。char

于 2012-07-06T07:08:23.910 に答える
1

の固定スコープに注意してくださいj。あなたのバージョンでは、常に に割り当てていましたs1[0]

for(int i = 0, j = 0; s[i] != '{'; i++)
{
    if(s[i] != '\\' && s[i] != '?')
    {
        // int j = 0;
        if(s[i] == '#')
        {
            s1[j] = '\\';
        }
        else
        {
            s1[j] = s[i];
        }
        j++;
    } 
}

もう 1 つは、新しい文字列に十分なスペースを割り当てることです。サイズを指定していないためchar s1[] = {0};、サイズ 1 の配列を宣言します。次のようにする必要があります。

char s1[sizeof(s)] = { 0 }; // the size of the old array, since we don't know how long the new one will be

しかし、Q C++ にタグを付けたので、動的に resizable を利用してくださいstd::string

std::string s = ".......";
std::string s1;

for(int i = 0; s[i] != '{'; i++)
{
    if(s[i] != '\\' && s[i] != '?')
    {
        if(s[i] == '#')
            s1 += '\\';
        else
            s1 += s[i];
    } 
}
于 2012-07-06T10:37:31.033 に答える
0

s1 バッファを増やす必要があります。現状では、新しい文字列のためのスペースがありません。

例えば

char* s1 = calloc(strlen(s)+1,sizeof(char)); // same size should be enough, free(s1) later

\0あなたのコードでは、callocを追加するのを忘れていた\0ので、出力が不規則に動作します。

于 2012-07-06T07:28:07.113 に答える