1

以下は、スペースを「%20」に置き換えるためにコンパイルしているプログラムですが、実行すると、出力ウィンドウに空白が表示され、「arrays5.exeが問題が発生しました」というメッセージが表示されます。

#include <iostream>
#include<cstring>

using namespace std;

void method(char str[], int len)               //replaces spaces with "%20"
{

    int spaces, newlen,i;

    for (i=0;i<len;i++)
        if(str[i]==' ') spaces++;
    newlen=len+spaces*2;
    str[newlen]=0;
    for (i=len-1;i>=0;i--)
    {
        if(str[i]==' ')
        {
            str[newlen-1]='0';
            str[newlen-2]='2';
            str[newlen-3]='%';
            newlen=newlen-3;
        }
        else
        {
            str[newlen-1]=str[i];
            newlen=newlen-1;
        }
    }
}
int main()
{
    char str[20]="sa h ";
    method(str,5);
    cout <<str<<endl;
    return 0;
}

エラーを見つけるのを手伝ってください。ありがとう

4

3 に答える 3

5

spacesインクリメントする前に初期化されていません。

初期のデフォルト値を指定する必要があります。

初期化されていない変数の値は、仕様で定義されていません。運が良ければ、この値は0になる可能性がありますが、この値は、データ型が表す可能性のある値の範囲内の値になる可能性が高くなります。

が正しく初期化されると、プログラムは正常にコンパイルおよび実行spacesされます。

于 2012-07-08T03:08:12.833 に答える
2

私はあなたの問題を解決しているわけではありませんが、より良い解決策を提供しています。C++ を使用している場合は、STL を使用する必要があります。すべての作業を行う多くのクラスとメソッドがあります。

25 行のメソッドをこの 4 行のメソッドに書き換えることができます (例を含む)。

#include <iostream>
#include <string>

using namespace std;

std::string method(std::string str)
{
    size_t index;
    while((index = str.find(' ')) != std::string::npos)
        str = str.replace(index, 1, "%20");
    return str;
}
int main()
{
    std::string str("sa h ");
    str = method(str);
    cout <<str<<endl; // outputs sa%20h%20
    return 0;
}
于 2012-07-08T03:13:28.250 に答える
0

std :: stringを使用し、.replaceメソッドを使用することをお勧めします。コードが機能しない理由は、入力文字列を奇妙な方法で上書きしているため、期待される出力が正しいかどうかはわかりませんが、実際のエラーは、次の場所で書き換えている可能性があることです。インデックスの場所-3、-2、および-1。最初のスペースがインデックスゼロにある場合を考えてみましょう。

C ++では、明確な理由がない限り、通常はchar*を避けることをお勧めします。良いスタイルの問題として(これはやや主観的です)、入力引数を直接変更せず、代わりに結果を返すことをお勧めします。

つまり、メソッドのプロトタイプは次のようになります。

std::string method(std::string str)

std :: stringがそれを処理するため、文字列の長さを渡す必要はなくなりました。

于 2012-07-08T03:09:56.390 に答える