2017-02-11 3 views
1
#include <iostream> 
#include<string.h> 
using namespace std; 
char *rt() 
{ 
    char a[20]; 
    strcpy(a,"I am a beginner"); 
    cout<<a; 
    return a; 
} 
int main() 
{ 
    char *a; 
    a=rt(); 
    cout<<endl; 
    cout<<a; 
    return 0; 
} 

Здесь я сделал короткую программу для понимания же .... Я ожидал, что выход будет, какКак вернуть строку в C++

I am a beginner 
I am a beginner 

UPDATE: Но оказалось

I am a beginner 
ëóG 

Я прочитал много статей и поста, но я не в состоянии понять их сложный язык .... поэтому я оценю без излишеств ответа (за глупый ... как м е !!)

UPDATE: На самом деле, есть один вопрос, в моем назначении, который идет как этот

class COMPUTER 
{ 
    char chiptype[10]; 
    int speed; 
public: 
    void showdetails() 
    { 
     cout<<chiptype; 
     cout<<"\t"<<speed; 
    } 
    void getdetails() 
    { 
     cin.getline(chiptype,10); 
     cin>>speed; 
    } 
}; 

Здесь данные должны быть считаны и сохранены в виде двоичного файла .... и должны быть отображены записи, имеющие , как «CD».

Теперь мой вопрос в том, что ... поскольку переменная chiptype является частной, поэтому я не могу использовать ее для сравнения в main() .... поэтому я подумал о создании функции, которая вернула значение, хранящееся в chiptype.

И я не разрешено использовать зЬй :: строку, а также реализации узла ...

+1

Хотя вы уже получили ответы, я хотел бы указать, что в целом ваш вопрос должен также включать то, что на самом деле происходит (например, результат, который вы действительно получили, какие ошибки и т. Д.) – UnholySheep

+0

@ πάντα ῥεῖ, что не является моим вопрос – Alu

+0

@Mukund Ну, может быть, вы спрашивали не то. Ответ там, хотя. –

ответ

3

char a[20]; выделено на стеке. Когда функция rt() возвращается, стек распаковывается и выходит из области видимости. Следовательно, вы не получите желаемого результата.

В то время как вы находитесь на C++, может я предлагаю использовать std::string

Читать комментарий ниже:

Другой трюк, чтобы обернуть массив в структуры, и возвращать структуры.Поскольку структура является скопируемой, массив внутренне становится с возможностью копирования и не потеряет область действия. См. Этот ответ. Тогда вы не , имея дело с указателями. См. Этот живой пример - PaulMcKenzie

+0

является std :: string единственным способом – Alu

+0

@Mukund Создайте свой собственный класс 'string'. В противном случае вы изучаете 'C', а не C++. – PaulMcKenzie

+0

Вы можете передать массив символов для заполнения в качестве параметра, isntead для его сохранения. Или выделите что-то новым [] в функции (уродливым, потому что вам нужно удалить [] его снаружи). И да, это вполне допустимый C++, даже если некоторым людям это не нравится. – deviantfan

2

Использование станд :: строка вместо полукокса []

#include <iostream> 
#include<string> 

std::string rt() 
{ 
    std::string a("I am a beginner"); 
    std::cout<<a; 
    return a; 
} 
int main() 
{ 
    std::string a; 
    a=rt(); 
    std::cout<<std::endl; 
    std::cout<<a; 
    return 0; 
} 

В исходном коде char a[20] является выделенные в стеке, и return a; вернет указатель на переменную стека, которая больше недействительна, когда вы ее получите у вас main() - обработка строк в C++ обычно должна выполняться с использованием std::string, поскольку она обрабатывает все неприятное управление памятью, которое уничтожит ваши если вы не будете осторожны.

Если вам нужно использовать указатели и не использовать std :: string, вам нужно будет пойти в стиле c с риском утечки памяти, если вы пропустите шаг или два. Код будет выглядеть примерно так, используя c стиль (удержание COUT C++)

#include <iostream> 
#include <strings.h> 

std::string rt() 
{ 
    char *a = malloc(20); // allocate the memory on heap 
    strcpy(a,"I am a beginner"); 
    std::cout<<a; 
    return a; 
} 
int main() 
{ 
    char *a; 
    a=rt(); 
    std::cout<<std::endl; 
    std::cout<<a; 
    free(a); // release the memory 
    return 0; 
} 

Внимание: я не рекомендую вам делать выше стиль - в реальном приложении вы, скорее всего, попасть в либо забыв о free памяти или случайно получив доступ к памяти после того, как она была освобождена

+0

thanx ..... но std :: string не в моей программе – Alu

+2

@Mukund Тогда ваша программа очень не хватает. Строка 'std :: string' была частью C++ уже 19 лет. – PaulMcKenzie

+0

@Mukund - это то, что вы должны делать независимо - в противном случае вам придется идти 'c' style вместо' C++' и запускать malloc и свободно выполнять собственное управление памятью. – Soren

0

Как уже упоминалось, использование std::string вместо char [].

std::string rt() 
{ 
    std:: string a = "I am a beginner"; // This statement is equivalent to   std::string a("I am a beginner"); 
    std::cout << a "\n"; 
    return a; 
} 

Основная причина не получить желаемого результата является "char a[] выделяется в стеке, но когда функция возвращает стек опустел

PS:. Вам необходимо включить <string> в вашей программе, использовать std::string

1

Проблема в том, что память a будет уничтожена, как только программа вернется из функции. Я не думаю, что вам следует работать с динамической памятью на уровне вашего знания, поэтому я предлагаю вам определить массив снаружи и просто изменить он внутри функции:

#include <iostream> 
#include<string.h> 
#define MAX_LENGTH 20 
using namespace std; 

void rt(char *a) 
{ 
    strcpy(a,"I am a beginner"); 
    cout<<a; 
} 

int main() 
{ 
    char a[MAX_LENGTH]; 
    rt(a); 
    cout<<endl; 
    cout<<a; 
    return 0; 
} 

Кроме того, вы должны позаботиться о том, rt не писать больше, чем MAX_LENGTH символов.

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