2016-03-10 71 views
2

學習一些基本的C++,試圖理解函數,但有一段時間試圖正確地編寫函數。 這裏的原代碼(正常工作):函數中的C++分段錯誤

#include <iostream> 
#include <string> 
//#include "assn.h" 

using namespace std; 

int main() 
{ 
    string userinput; 
    char ch1 = '-'; 

    cout << "Enter word: "; 
    getline(cin, userinput); 

    int i = 0; 
    for (i; i < userinput.size(); ++i) 
    { 
     if (userinput.at(i) >= 'a' && userinput.at(i) <= 'z') 
     userinput.at(i) = ch1; 
    } 

    cout << userinput << endl; 
    return 0; 
} 

,這裏是我打字試圖使它的功能代碼:

#include <iostream> 
#include <string> 
//#include "assn.h" 

using namespace std; 

string inputUnsolved(string input); 

int main() 
{ 
     string userinput; 
     cout << "Enter word: "; 
     getline(cin, userinput); 

     inputUnsolved(userinput); 

     cout << userinput << endl; 
     return 0; 
} 

string inputUnsolved(string input) 
{ 
    char ch1 = '-'; 

    int i = 0; 
    for (i; i < input.size(); ++i) 
    { 
     if (input.at(i) >= 'a' && input.at(i) <= 'z') 
      input.at(i) = ch1; 
    } 
} 

它編譯罰款,但在進入userinput並試圖執行後,它顯示「分段錯誤」

嘗試重寫幾次沒有運氣,我很坦白地不知道足以找到一種方法來解決它。代碼基本上讀入一個字符串變量並將其顯示爲一組破折號(hangman)。

+0

不知道是相關的段故障錯誤,但(1)'input'是按值傳遞的參數,它會被複制並具有無關變量'userinput'在'主()'。 (2)你應該在'inputUnsolved()'中返回。 – songyuanyao

+0

由於您在'inputUnsolved'中沒有return語句,所以無法編譯,這是一個編譯錯誤。所以必須有更多的代碼讓它崩潰。 –

回答

2

將參數input按值傳遞給函數。這意味着它得到副本的變量main。任何更改僅在此副本上執行,並不影響原始值。

嘗試通過引用而不是string&

此外,該函數有一個返回類型string,但我沒有在函數中看到任何return語句。返回一些值或將返回類型更改爲void

+0

謝謝博!我會做出這些改變,看看我是否有更好的運氣 – HHughes

1

試試這個:

#include <iostream> 
#include <string> 
//#include "assn.h" 

using namespace std; 

void inputUnsolved(string &input); 

int main() 
{ 
     string userinput; 
     cout << "Enter word: "; 
     getline(cin, userinput); 
     inputUnsolved(userinput); 
     cout << userinput << endl; 
     return 0; 
} 

void inputUnsolved(string &input) 
{ 
    char ch1 = '-'; 
    for (int i=0; i<input.size(); ++i) 
    { 
     if (input.at(i) >= 'a' && input.at(i) <= 'z') 
     input.at(i) = ch1; 
    } 
} 

首先,有沒有必要返回一個字符串。其次,如答案中所述,您應該通過引用發送字符串,以便更改反映在輸入字符串中。

如果你想返回一個字符串,你可以這樣做:

string inputUnsolved(string input) 
{ 
    char ch1 = '-'; 
    for (int i=0; i<input.size(); ++i) 
    { 
     if (input.at(i) >= 'a' && input.at(i) <= 'z') 
     input.at(i) = ch1; 
    } 
    return input; 
} 

C++編譯器應該優化它。請考慮應該......你永遠不知道編譯器的開發者做了什麼......通過參考

+0

@songyuanyao Thx,現在修復 – asalic

+0

謝謝!沒有更多的段錯誤 – HHughes

2

票代替

void inputUnsolved(string& input); 
+0

謝謝!擺脫段錯誤 – HHughes

1

你正在做一些錯誤的事情:

  1. 你通過string,並期望編輯這是錯誤的。
  2. 定義你的函數返回未返回任何東西

你正在做一些不好的事情串:

  1. using namespace std這個壞習慣。
  2. 使用int索引這是一個簽名類型和小於可能的大小。

這是解決你的問題:

#include <iostream> 
#include <string> 


std::string inputUnsolved(const std::string& input); 

int main() 
{ 
     std::string userinput; 
     std::cout << "Enter word: "; 
     std::getline(std::cin, userinput); 

     userinput=inputUnsolved(userinput); 

     std::cout << userinput << std::endl; 
     return 0; 
} 

std::string inputUnsolved(const std::string& input) 
{ 
    std::string result; 
    result.reserve(input.size()); 
    char ch1 = '-'; 

    for (std::size_t i=0; i < input.size(); ++i) 
    { 
     if (input.at(i) >= 'a' && input.at(i) <= 'z'){ 
      result.push_back(ch1); 
     } 
     else{ 
      result.push_back(input.at(i)); 
     } 
    } 
    return result; 
} 
+0

明白了,謝謝!我不太瞭解名字空間,我只知道我的教授要求我們使用它。那麼它不是最優的? – HHughes

+0

http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice –

+1

我明白了,謝謝Humam – HHughes

1

試試這個它會爲你工作的肯定,問題是,你的價值,而不是引用傳遞的變量輸入,因爲如果不是,不管你做什麼,它不會變成「---」,當你使用refrence時,你要確保你修改了相同的變量。我添加的第二件事是,你不需要使你的函數的返回值是一個字符串,使它更容易,並使其無效。

#include <iostream> 
    #include <string> 
    //#include "assn.h" 

    using namespace std; 

    void inputUnsolved(string& input); 

    int main() 
    { 
      string userinput; 
      cout << "Enter word: "; 
      getline(cin, userinput); 

      inputUnsolved(userinput); 

      cout << userinput << endl; 
      return 0; 
    } 

    void inputUnsolved(string& input) 
    { 
     char ch1 = '-'; 

     int i = 0; 
     for (i; i < input.size(); ++i) 
     { 
      if (input.at(i) >= 'a' && input.at(i) <= 'z') 
       input.at(i) = ch1; 
     } 


    }