我正在研究 C 中的指標。我研究了按值呼叫和按參考呼叫的概念。我正在嘗試創建一個函式來反轉字串,該字串接受指向字串的指標和字串的大小。代碼如下
void reverse(string* str, int size)
{
int start = 0;
int end = size - 1;
while(start < end)
{
swap(*str[start ], *str[end--]);
}
}
int main()
{
string str = "Something";
reverse(&str, str.length());
cout << "Reversed string: " << str << endl;
return 0;
}
我收到此錯誤:
error: no match for ‘operator*’ (operand type is ‘std::string’ {aka
‘std::__cxx11::basic_string’})
12 | swap(*str[start ], *str[end--]);
我不想使用字符陣列,有辦法嗎?有人請解釋一下,我的代碼有什么問題。謝謝你。
uj5u.com熱心網友回復:
這是簡單的修復。除了幾行之外,您不需要更改任何內容。
#include <iostream>
#include <algorithm>
#include <cstring>
void reverse( std::string* str ) // no need to pass size to this function
{
int start = 0;
int end = str->length() - 1; // get the length of str like this
char* ptrToCharArray = const_cast<char*>( str->c_str() ); // gets the pointer to str's internal buffer
while ( start < end )
{
std::swap( ptrToCharArray[start ], ptrToCharArray[end--] ); // no need to use * operator anymore
}
}
int main()
{
std::string str = "Something";
reverse( &str );
std::cout << "Reversed string: " << str << std::endl;
return 0;
}
輸出是:
Reversed string: gnihtemoS
希望這對您有所幫助。
uj5u.com熱心網友回復:
只需要在您的代碼中稍作更改 將此 *str[start ] 更改為 (*str).at(start )
void reverse(string* str, int size)
{
int start = 0;
int end = size - 1;
while(start < end)
{
swap((*str).at(start ),(*str).at(end--));
}
}
int main()
{
string str = "Something";
reverse(&str, str.length());
cout << "Reversed string: " << str << endl;
return 0;
}
uj5u.com熱心網友回復:
請注意,不需要將字串的大小作為引數傳遞給函式。您可以std::string::size為此目的使用成員函式,如下所示:
版本 1:將指向字串的指標作為引數傳遞
#include <iostream>
#include <algorithm>
void reverse(std::string *str)
{
int n=(*str).size()-1;//dereference the pointer and use size member function on the resulting string object
for(int i=0;i<((*str).size()/2);i ){
//Using the swap method to switch values at each index
std::swap((*str).at(i),(*str).at(n)); //note this can also be written as std::swap((*str)[i],(*str)[n]);
n = n-1;
}
}
int main()
{
std::string myString = "myString";
reverse(&myString);
std::cout<<"Reversed string is: "<<myString<<std::endl;
return 0;
}
在版本 1 中,*(str)給了我們一個std::string型別物件。接下來我們size在這個std::string物件上呼叫成員函式。同樣我們可以呼叫std::string::at這個std::string物件的成員函式。
版本 2:傳遞對字串的參考作為引數
#include <iostream>
#include <algorithm>
void reverse( std::string &str)
{
int n=str.size()-1;
for(int i=0;i<(str.size()/2);i ){
//Using the swap method to switch values at each index
std::swap(str.at(i),str.at(n));
n = n-1;
}
}
int main()
{
std::string myString = "myString";
reverse(myString);
std::cout<<"Reversed string is: "<<myString<<std::endl;
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/361006.html
