C ++分段功能故障

时间:2016-03-10 08:27:40

标签: c++ string function segmentation-fault

学习一些基本的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并尝试执行后,它会显示“Segmentation fault”

在没有运气的情况下尝试重写几次,老实说,我不知道找到解决办法的方法。代码基本上读入一个字符串变量并将其显示为一组破折号(hangman)。

5 个答案:

答案 0 :(得分:2)

您将参数input按值传递给函数。这意味着它在main中获得了变量的副本。任何更改仅对此副本执行,不会影响原始值。

尝试通过引用传递,string&

此外,该函数的返回类型为string,但我在函数中看不到任何return语句。要么返回一些值,要么将返回类型更改为void

答案 1 :(得分:2)

通过引用传递

void inputUnsolved(string& input);

答案 2 :(得分: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 ++编译器应该为您优化它。请考虑到......你永远不知道编译器的开发者做了什么......

答案 3 :(得分:1)

你做错了事:

  1. 您通过了string并希望进行编辑,这是错误的。
  2. 您定义函数以返回未返回任何内容的字符串
  3. 你正在做一些坏事:

    1. using namespace std这种不良做法。
    2. 使用int进行索引,这是一种签名类型且小于可能的大小。
    3. 这是解决问题的方法:

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

答案 4 :(得分:1)

试试这个肯定会对你有用,问题是你通过值而不是引用来传递变量输入,因为如果没有,无论你是什么,它都不会改为“---”,当你使用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;
        }


    }