学习一些基本的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)。
答案 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)
你做错了事:
string
并希望进行编辑,这是错误的。你正在做一些坏事:
using namespace std
这种不良做法。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;
}
答案 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;
}
}