使用函数调用反转单词

时间:2013-06-18 17:33:09

标签: c++

如何输入一个单词并反转它的输出。我做了一个函数来计算单词的长度,从这里我必须根据单词的长度来反转单词。 我怎样才能做到这一点?

 #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--) */ 

}

3 个答案:

答案 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::setstd::vectorstd::list等。 std::stringstd::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 *。