2012-05-24 4 views
4

Я получаю ошибку шины в своем коде. С помощью этого кода я пытаюсь преобразовать числа в слова, но я знаю, что в моей логике есть недостаток. Но до этого, когда я компилирую и запускаю этот код с помощью g ++ в mac, я пытаюсь сделать этот код таким, как есть, и я получаю ошибку шины. Любая помощь будет оценена по достоинству.Я получаю ошибку шины в следующем коде

Когда я запускаю код, я получаю следующий вывод. У меня есть отладочные сообщения для отслеживания ошибок.

 
    Enter a number:1234 
    main 1:numbers are:234 
    Function1: Number is 234 
    two 
    two hundred 
    34Function2: Number is 34 
    Function3: Number is 34 
    Bus error: 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; 
} 
+2

Какая строка кода вызывает ошибку шины? Запуск его в отладчике должен показать вам, какой именно оператор вызывает ошибку. – Crashworks

+8

Добро пожаловать в StackOverflow. Когда вы пишете слова «ошибка», очень важно, чтобы ** следующее следующее **, которое вы пишете, является ** точной ** ошибкой, которую вы получаете, включая сообщение об ошибке, которое вы видите. Мы не можем видеть ваш экран здесь, и ожидаем, что каждый попытается скомпилировать/запустить ваш код, чтобы узнать, что вы просите, очень невнимателен. Если вам нужна помощь здесь, вы должны предоставить информацию, которая позволит нам вам помочь. Пожалуйста, уделите несколько минут обзору [FAQ] (http://stackoverflow.com/faq), особенно о том, как задавать вопросы здесь. Благодарю. :) –

+0

Первое, что вам нужно сделать, когда ваши программы выходят из строя (неважно, что такое авария), - это запустить его в отладчике. Это поможет вам определить местоположение аварии, а также позволить вам просматривать переменные, чтобы увидеть, что могло бы вызвать крах. –

ответ

3

Причина вы получаете ошибки шины, потому что вы пытаетесь писать в нелесные записываемой области (т.е. в символьной константы, а также в конце прошлого него); это неопределенное поведение.

// 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 пытается записать в завершающем нуль string, а затем продолжает писать мимо конца строки постоянной. Это неопределенное поведение, поэтому ваша программа вылетает из строя.

Для решения этой проблемы необходимо скопировать " " в string, а не назначать ее указателю string.

+0

Спасибо за ответ. Это имеет смысл. Но только путаница, с которой я столкнулся сейчас, заключается в том, что если я ввожу 3-значное число, например 234, как вход, то он отлично работает. Я получаю ошибку шины только при вводе четырехзначных чисел или более. –

+0

@DangerousScholar Это связано с тем, что, когда вы вводите число меньше 1000, вы попадаете в ветвь 'else', где' string' присваивается еще раз, прежде чем вы «strcat» в нее. Присвоенное значение - это динамически выделяемое слово '' из 'convert_number', у которого достаточно памяти за конец строки для' strcat' для работы без ошибки. – dasblinkenlight

+0

Опять же, Отладочное сообщение говорит, что ошибка должна быть между следующим кодом справа? cout << "Function3: Number is" << number << endl; if (номер <20) { слово = strcat (слово, слова [число]); слово = strcat (слово, ""); } cout << "Возвращаемое слово:" << слово; –

Смежные вопросы