[英]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 ++編譯器應該為您優化它。 請考慮到......你永遠不知道編譯器的開發者做了什么......
你做錯了什么:
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;
}
試試這個它肯定會對你有用,問題是你通過值而不是引用傳遞變量輸入,因為如果沒有,無論你進行什么,它都不會改為“---”,當你使用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.