2013-05-18 3 views
3

Это простой пример программы:Как вернуть строку в функции C++?

#include <iostream> 
#include <string> 

using namespace std; 

string replaceSubstring(string, string, string); 

int main() 
{ 
    string str1, str2, str3; 

    cout << "These are the strings: " << endl; 
    cout << "str1: \"the dog jumped over the fence\"" << endl; 
    cout << "str2: \"the\"" << endl; 
    cout << "str3: \"that\"" << endl << endl; 
    cout << "This program will search str1 for str2 and replace it with str3\n\n"; 

    cout << "The new str1: " << replaceSubstring(str1, str2, str3); 

    cout << endl << endl; 
} 

string replaceSubstring(string s1, string s2, string s3) 
{ 
    int index = s1.find(s2, 0); 

    s1.replace(index, s2.length(), s3); 

    return s1; 
} 

Компилируется однако функция ничего не возвращает. Если я изменю return s1 до return "asdf", он вернется asdf. Как я могу вернуть строку с помощью этой функции?

+8

Вы фактически не инициализируете свои строковые переменные. – Cairnarvon

+0

Почему, по вашему мнению, возникает проблема с возвратом строки? Проверьте значения строк внутри функции. – juanchopanza

+0

Текст, который вы выводите, - это просто текст компилятору - он не попытается понять, что означает этот текст, и не будет выполнять ваши обещания для вас. В конце концов, возможно, вы * подразумевали * лгать пользователю. – Steve314

ответ

10

Вы никогда не придаете значения вашим строкам в main, поэтому они пусты, и, следовательно, функция возвращает пустую строку.

Заменить:

string str1, str2, str3; 

с:

string str1 = "the dog jumped over the fence"; 
string str2 = "the"; 
string str3 = "that"; 

Кроме того, у вас есть несколько проблем в вашей replaceSubstring функции:

int index = s1.find(s2, 0); 
s1.replace(index, s2.length(), s3); 
  • std::string::find возвращает std::string::size_type (aka. size_t) не int. Два отличия: size_t не имеет значения, и это не обязательно такой же размер, как int в зависимости от вашей платформы (например, на 64 бита Linux или Windows size_t без знака 64 бит, а int - 32 бита).
  • Что произойдет, если s2 не является частью s1? Я оставлю это вам, чтобы узнать, как это исправить. Подсказка: std::string::npos;)
+0

Да. Уже поздно. Голова головы кости. Благодарю. – fredsbend

+0

@fredsbend: Я добавил еще один вопрос (не связанный с вашим вопросом) с вашим кодом. См. Мое редактирование. – syam

+0

С тех пор я обратился к точке два с циклом while, который прерывается, если 'index' больше, чем' s1.length() '. Эффект заключается в том, что теперь он заменяет все экземпляры 's2'' s3'. Я не знаком с 'size_t', хотя я столкнулся с этим. – fredsbend

2

Назначьте что-нибудь своим строкам. Это определенно поможет.

3
string str1, str2, str3; 

cout << "These are the strings: " << endl; 
cout << "str1: \"the dog jumped over the fence\"" << endl; 
cout << "str2: \"the\"" << endl; 
cout << "str3: \"that\"" << endl << endl; 

Исходя из этого, я вижу, что вы не инициализирован str1, str2 или Str3 содержат значения, которые вы печатаете. Я мог бы предложить сделать это сначала:

string str1 = "the dog jumped over the fence", 
     str2 = "the", 
     str3 = "that"; 

cout << "These are the strings: " << endl; 
cout << "str1: \"" << str1 << "\"" << endl; 
cout << "str2: \"" << str2 << "\"" << endl; 
cout << "str3: \"" << str3 << "\"" << endl << endl; 
Смежные вопросы