【问题标题】:C++ segmentation fault in function函数中的 C++ 分段错误
【发布时间】:2016-03-10 08:27:39
【问题描述】:

学习了一些基本的 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)。

【问题讨论】:

  • 不确定是否与段错误错误有关,但是(1)参数input是传值,​​会被复制,与变量userinput中的变量无关main()。 (2) 你应该在inputUnsolved()中返回。
  • 它无法正常编译,因为您在inputUnsolved 中没有返回语句 - 这是一个编译错误。所以肯定有更多的代码让它崩溃。

标签: c++ string function segmentation-fault


【解决方案1】:

改为通过引用传递

void inputUnsolved(string& input);

【讨论】:

  • 谢谢!摆脱了段错误
【解决方案2】:

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

尝试通过引用传递,string&amp;

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

【讨论】:

  • 谢谢博!我会做出这些改变,看看我是否有更好的运气
【解决方案3】:

试试这个:

#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++ 编译器应该为您优化它。请考虑应该...您永远不知道编译器的开发人员做了什么...

【讨论】:

  • @songyuanyao 谢谢,现已修复
【解决方案4】:

你做错了事:

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

【讨论】:

【解决方案5】:

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


    }

【讨论】:

    猜你喜欢
    • 2018-10-08
    • 2020-06-19
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    相关资源
    最近更新 更多