6

コードでバス エラーが発生しています。このコードを使用して数字を単語に変換しようとしていますが、ロジックに欠陥があることがわかっています。しかし、その前に、Macで g++ を使用してこのコードをコンパイルして実行すると、このコードをそのまま実行しようとすると、バス エラーが発生します。どんな助けでも大歓迎です。

コードを実行すると、次の出力が得られます。エラーが発生した場所を追跡するためのデバッグ メッセージがあります。

    数字を入力してください:1234
    メイン 1:数字は:234
    Function1: 数は 234
    2
    200
    34Function2: 数は 34
    Function3: 数は 34
    バス エラー: 10

#include <iostream>
#include <string>

using namespace std;
char *convert_number(int);

char *tens[] = {"", "ten", "twenty", "thirty", "forty",
                "fifty", "sixty", "seventy", "eighty", "ninety"};

char *words[] = {"zero", "one", "two", "three", "four",
                 "five", "six", "seven", "eight", "nine",
                 "ten", "eleven", "twelve", "thirteen", "fourteen",
                 "fifteen", "sixteen", "seventeen", "eighteen", "ninteen"};

char *place[] = {"", "hundred", "thouands", "million", "billion", "trillion"};


int main(int argc, char **argv)
{
    int number, conv_num, places;
    places = 1;
    char *string = new char[1000];
    char *temp_string = new char[100];
    cout << "Enter a number:";
    cin >> number;
    string = " ";
    if (number >= 1000)
    {
        while(number >= 1)
        {
            conv_num = number % 1000;
            cout << "main 1:numbers are:" << conv_num << endl;
            temp_string = convert_number(conv_num);
            string =strcat(string, temp_string);
            string =strcat(string, " ");
            number = 0; // (number-conv_num)/1000;
            cout << "main 2:numbers are:" << endl;
            //cout << conv_num << ":" << number << endl;
        }
    }
    else
    {
        string = convert_number(number);
        string = strcat(string, " ");
    }
    cout<<"Main: The word is :"<<string<<endl;
}

char *convert_number(int number)
{
    int divisor;
    char *word;
    word = new char[100];
    divisor = 10;
    cout << "Function1: Number is " << number << endl;

    if (number >= 100)
    {
        word = strcat(word, words[number/100]);
        cout << word << endl;
        word = strcat(word, " hundred ");
        cout << word << endl;
        number = number%100;
        cout << number;
    }
    cout << "Function2: Number is " << number << endl;

    if (number >= 20)
    {
        word = strcat(word, tens[number/10]);
        word = strcat(word, " ");
        if (number%divisor >= 1)
        {
            word=strcat(word, words[number%divisor]);
            word =strcat(word, " ");
        }
    }
    cout << "Function3: Number is " << number << endl;

    if (number < 20)
    {
        word = strcat(word, words[number]);
        word = strcat(word, " ");
    }
    cout << "Returning word:" << word;
    return word;
}
4

1 に答える 1

4

バス エラーが発生する理由は、書き込み不可領域 (つまり、文字定数、およびその末尾を超えた領域) に書き込もうとしているためです。これは未定義の動作です。

// Good: allocate 100 bytes to string 
char *string = new char[100];

// Bad! Compiler warns you that assigning character const to char* is wrong.
// It does not tell you that you've just leaked the 100 bytes that you allocated
/// before, but that's also true.
string=" ";

// ... some more code, and then
string = strcat(string,temp_string); // <<== HERE is the problem!

への呼び出しはstrcat、 の終端の 0 に書き込みを試みstring、文字列定数の末尾を超えて書き込みを続けます。これは未定義の動作であるため、プログラムがクラッシュします。

この問題を解決するには、ポインターに代入するのではなく、にコピー" "する必要があります。stringstring

于 2012-05-24T01:36:28.990 に答える