我需要创建reverse()函数来对str中的字符进行反向计数。 这是它的原型:
void reverse(char **str, int count = ???);
我需要为count设置默认值,以便该行完全相反。
我尝试将其分配如下:
void reverse(char **str, int count = strlen(*str))
但是编译器显示以下错误:
error: local variable ‘str’ may not appear in this context
void reverse(char **str, int count = (int) strlen(*str)) {
这是我的代码:
#include <iostream>
#include <cstring>
using namespace std;
void reverse(char **str, int count = (int) strlen(*str)) {
int i;
char temp;
for (i = 0; i < count / 2; i++) {
temp = (*str)[i];
(*str)[i] = (*str)[count - i];
(*str)[count - i] = temp;
}
}
int main() {
char buf[100];
cout << "Enter your string:\n" << endl;
cin >> buf;
char *str;
str = new char(strlen(buf)+1);
strcpy(str, buf);
reverse(&str);
cout << "Reversed string:\n" << str << endl;
return 0;
}
我该如何处理?
答案 0 :(得分:3)
根据保罗·麦肯齐的说法。您不需要指向指针的指针就可以将字符串反向转换。仅在尝试更改指针时才需要指向指针的指针。但不是,您正在尝试更改所指向的内容,因此只需一个简单的指针即可。
参数的默认值必须是常量,而不是函数调用。
然后您的算法就被淘汰了,在str[count - i]
中,当i
为零时,您将索引str[count]
移到字符串末尾。
尝试一下
void reverse(char *str, int count = -1)
{
if (count < 0)
count = strlen(str);
for (int i = 0; i < count / 2; i++)
{
char temp = str[i];
str[i] = str[count - i - 1];
str[count - i - 1] = temp;
}
}
答案 1 :(得分:1)
由于您使用的是C ++,因此如果使用std::string
而不是char *
,则使用默认的整个字符串(或提供的前count
个字符)进行反转变得非常简单为:
std::string reverse (const std::string& s, size_t count = 0)
{
if (count > s.length())
count = 0;
if (count)
count = s.length() - count;
return std::string (s.rbegin() + count, s.rend());
}
一个简短的例子是:
#include <iostream>
#include <string>
std::string reverse (const std::string& s, size_t count = 0)
{
if (count > s.length())
count = 0;
if (count)
count = s.length() - count;
return std::string (s.rbegin() + count, s.rend());
}
int main (void)
{
std::string s("123456789");
std::string r = reverse(s);
std::cout << "s\n" << s << "\n\nreverse(s)\n" << r
<< "\n\nreverse(s, 2)\n";
r = reverse(s, 2);
std::cout << r << "\n\nreverse(s, s.length() - 1)\n";
r = reverse(s, s.length() - 1);
std::cout << r << '\n';
}
(请参阅:std::basic_string::rend, std::basic_string::crend和std::basic_string::rbegin, std::basic_string::crbegin)
使用/输出示例
$ ./bin/strrev
s
123456789
reverse(s)
987654321
reverse(s, 2)
21
reverse(s, s.length() - 1)
87654321
始终打印完整字符
如果您只想反转count
字符,而只打印反转的结果字符串的全长,则可以执行以下操作:
std::string reverse (const std::string& s, size_t count = 0)
{
if (count > s.length())
count = 0;
if (count) {
count = s.length() - count;
return std::string (s.rbegin() + count, s.rend()) + suffix;
}
return std::string (s.rbegin() + count, s.rend());
}
所有字符
$ ./bin/strrev
s
123456789
reverse(s)
987654321
reverse(s, 2)
213456789
reverse(s, s.length() - 1)
876543219
与使用基本类型相比,容器库具有许多优点。
答案 2 :(得分:0)
所以它应该这样工作:
#include <iostream>
#include <cstring>
using namespace std;
void reverse(char *str) {
int count = (int)strlen(str);
char temp;
for (int i = 0; i < count / 2; i++) {
temp = str[i];
str[i] = str[count - i-1];
str[count - i-1] = temp;
}
}
int main() {
char buf[100];
cout << "Enter your string:\n" << endl;
cin >> buf;
char *str;
str = new char(strlen(buf)+1);
strcpy(str, buf);
reverse(str);
cout << "Reversed string:\n" << str << endl;
return 0;
}
您只需要给函数提供字符串,而不是给字符串的指针。字符**太多,您可以更改字符,因为您已经有一个字符*指针。如果您不将字符串的长度提供给函数,则您不会犯任何错误。我反向调用strlen函数,这会增加一个O(n)的时间复杂度,这并不是有问题的,因为您的函数已经在O(n)中运行。如果您想知道为什么我使用str [count -i-1],那是因为cString是0终止的,这意味着字符串“ hallo”实际上是“” hallo \ 0“,带有-1字面量,请确保不要更改终止cString所需的此'\ 0'。