如何输入一个单词并反转它的输出。我做了一个函数来计算单词的长度,从这里我必须根据单词的长度来反转单词。 我怎样才能做到这一点?
#include<iostream>
using std::cout;
using std::endl;
using std::cin;
int LengthOfString( const char *); // declaring prototype for length of the string
int reverse(const char []);
int main()
{
char string1[100];
cout<<"Enter a string: ";
cin>>string1;
cout<<"Length of string is "<<LengthOfString(string1);
system("PAUSE");
return 0;
}
int LengthOfString( const char *x)
{
int index;
for(index = 0; *x!='\0';x++,index++);
return index;
}
int reverse(const char y[])
{
/* my attempted loop, its not right i know.
a[] = *index; // length of the word
for(int i=0; i<=index/2; i++)
for(j=0; j == length, j--) */
}
答案 0 :(得分:7)
这个轮子已经发明,存在于标准库中。
#include <iostream>
#include <string>
#include <algorithm>
int main()
{
std::string word;
std::cout << "Enter a word: ";
std::cin >> word;
std::reverse(word.begin(), word.end());
std::cout << "Reverse: " << word << std::endl;
return 0;
}
要明确了解这里发生了什么,首先必须涵盖一些事项:
我希望你已经知道课程是什么。如果你仍然在介绍性的东西,一个类基本上是用户定义的状态和行为的集合。作者可以出于各种原因选择限制对类的状态或行为的访问。对于std::string
,标准库字符串类,所有状态都是隐藏的,只有行为可以访问。
字符串类是包含字符的容器。还有许多其他容器类,每个类都有不同的优点和缺点。字符串类包含具有严格顺序的字符序列。存在其他容器,例如std::set
,std::vector
,std::list
等。 std::string
与std::vector
有相似之处,是std::list
的远房表亲。每个集合的行为都不同,适合不同的事物。
您可能认为您需要了解字符串类如何存储其数据以便将其反转,但您不需要。这是迭代器的用武之地。std::string
拥有一个typedef,std::string::iterator
,它是一个特殊的对象,用于存储单个元素在字符串中的位置。 std::reverse
是一个库函数,它接受2个迭代器并重复交换它们的内容并将它们相互移动。这看起来像是正在发生的事情:
v v <-- positions of iterators (start at the start, end at the end)
ABC <-- initial state
v v <-- the end iterator moved back
ABC
v v
CBA <-- the iterators swapped their values
vv <-- the begin iterator moved forward
CBA
V <-- the end iterator moved back; both iterators are in the same place
CBA <-- therefore, we're done, the string is reversed
关于迭代器的一件事是它们有点像指针。实际上,您可以将指针传递给某些期望迭代器的函数,因为它们在语法上的行为相同。因此,您应该能够编写自己的反向函数,该函数使用基本上与此相同的指针,除了char *
s。
这是一些伪代码,你应该能够编写这个函数(我不会完全写出来因为它的功课):
namespace BaidNation
{
void reverse(char *begin, char *end)
{
loop forever
{
if (end equals begin):
done;
move end backwards;
if (end equals begin):
done;
swap end's and begin's characters;
move begin forwards;
}
}
}
请记住,BaidNation::reverse
(以及std::reverse
)期望结束引用元素 AFTER 集合结尾的迭代器,而不是引用它的那个最后一个元素。那么使用它有什么意义呢?
您的LengthOfString
函数返回字符串中的非空字符数。由于数组是零索引的,我们知道,与任何其他数组一样,如果我们检查string1 + LengthOfString(string1)
,我们将在结束后得到一个指向该字符的指针,这一次,正是我们想要的。
因此,我们可以使用它来反转字符串:
BaidNation::reverse(string1, string1 + LengthOfString(string1));
如果您之前必须使用完全签名,则可以将此设计改编为另一个:
int reverse(const char str[])
{
char *start = str, *end = str + LengthOfString(str);
BaidNation::reverse(start, end);
}
答案 1 :(得分:2)
基于原型函数的返回类型为int
的事实,我认为你想要对字符串进行就地反转。首先需要找出字符串的长度(虽然你之前计算过,但是没有将结果传递给这个函数),然后交换元素直到你到达中间。要完成这项工作,您需要通过,而不是const char[]
,而只需char*
(表示您将更改内容):
int reverse(char* y)
{
int ii, n;
n = LengthOfString(y); // "no built in functions - otherwise, use strlen()
for(ii=0; ii<n/2;ii++) {
char temp;
temp = y[ii];
y[ii] = y[n - ii - 1];
y[n - ii] = temp;
}
}
答案 2 :(得分:0)
声明一个相同长度的新char *,然后循环如下 -
for(int i=0;i<stringLength;i++){
newString[i]=oldString[stringLength-i];
}
return newString;
另外,您可能需要考虑使用String类而不是char *。