簡體   English   中英

C ++分段功能故障

[英]C++ segmentation fault in function

學習一些基本的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;
    }
}

它編譯得很好,但是在輸入用戶輸入並嘗試執行后,它會顯示“Segmentation fault”

嘗試重寫幾次沒有運氣,老實說,我不知道找到解決方法的方法。 代碼基本上讀入一個字符串變量並將其顯示為一組破折號(hangman)。

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

嘗試通過引用傳遞, string&

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

相反通過參考

void inputUnsolved(string& input);

嘗試這個:

#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 ++編譯器應該為您優化它。 請考慮到......你永遠不知道編譯器的開發者做了什么......

你做錯了什么:

  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;
}

試試這個它肯定會對你有用,問題是你通過值而不是引用傳遞變量輸入,因為如果沒有,無論你進行什么,它都不會改為“---”,當你使用refrence你確保修改相同的變量entred。 我添加的第二件事是你不需要將函數的返回值設為字符串,使其更容易並使其無效。

  #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;
        }


    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM