关于反转字符串的程序的意见

时间:2012-11-03 17:43:25

标签: c++ reverse

我刚刚完成了一个反转给定字符串的程序。现在,字符串长度必须为11,但这很容易改变,我想要的是你的意见。

请注意,我是一名汇编程序员,这就是为什么我不习惯“使用标准库”,而不是习惯于“暴力破解”。

#include <iostream>
#include <string>

using namespace std;

char* reverse(char* input, int start_pos, int end_pos) {
    char *output = new char[11];

    for (int i = start_pos; i <= end_pos; i++)
      output[end_pos - i] = input[i];

    return output;
}

int main () {
  char ali[11];
  char b[11];
  cout << "please enter your string" << endl;               
  cin.getline(ali, 20);

  int spaces[4];
  spaces[0]=0;
  int c=1;

  for (int y = 0; y < 11; y++)
    if (ali[y] == ' ') {
      spaces[c] = y;
      c++;
    }

  c--;

  for (int u = 0; u < 11 - 1 - spaces[c]; u++) {
    b[u] = ali[spaces[c] + 1 + u];
    cout << b[u];
  }

  b[11 - 1 - spaces[c]] = ' ';
  cout << b[11 - 1 - spaces[c]];

  for (int u = 0 + 11 - spaces[c], dd = 0; u < 11 - 1 - spaces[c - 1], dd < spaces[c]-spaces[c-1]; u++, dd++) {
    b[u] = ali[spaces[c - 1] + 1 + dd];
    cout << b[u];
  }

  b[11 - spaces[c - 2]] = ' ';
  cout << b[11 - spaces[c - 2]];

  for (int u = 0 + 11 - spaces[c - 1], dd = 0; u < 11 - 1 - spaces[c - 2], dd < spaces[c - 1] - spaces[c - 2]; u++, dd++) {
    b[u] = ali[spaces[c - 2] + dd];
    cout << b[u];
  }

  cout<<endl;
  system("pause");
  return 0;
}

1 个答案:

答案 0 :(得分:3)

代码的一个大问题是模块化问题。如果你注意到,你的代码中有很多硬编码的东西。

例如:

char ali[11];
char b[11];

如果要更改它,则不必每次都设置这些字符数组的大小,而是创建两个文件,一个包含实现(.cpp),另一个包含接口(.h)。 如果您通常是汇编程序员而不是您可能不熟悉,但基本上,.h文件是您声明所有函数并包含您将使用的所有其他标题的位置。在你的.cpp中你定义了所有的函数,这对你来说是一个好主意,因为你的所有代码都在main中,这使得它不是模块化的,而且难以阅读。

回到硬编码问题,在头文件中声明一个宏。宏是一个预处理器命令,它向编译器说:“嘿,每次在程序中的任何地方看到这个变量名,用它替换它”。

#define kStringSize 11

你就是这样做的。我总是按照惯例将宏名称以k开头,这样我就可以更轻松地选择它们了。

以下是一个示例C ++头文件和相关的头文件供您查看:

example.h文件

#ifndef EXAMPLE
#define EXAMPLE
#include <iostream>
//extra headers go here
using namespace std;
//Macros and pound defines go here
#define kSize 11

//Function declarations go here
void doSomething(int);
bool doSomethingElse(string);

#endif //EXAMPLE

example.cpp

#include "example.h"

void doSomething(int i)
{
//your code here
}

bool doSomethingElse(string name)
{
//do something else
}

您的主要功能可以在此文件中,也可以在名为main.cpp的单独文件中。这真的取决于你。

你也可能会注意到在.h文件中,我有这段代码:

#ifndef EXAMPLE
#define EXAMPLE

然后在最后:

#endif //EXAMPLE

这三行应该绕过每个头文件。单词示例将根据您的头文件被调用的内容而改变,但实际上,这些行可以保护您不包含循环循环或双重包含的文件。例如,如果头文件A包括头文件B,其包括C然后包括A,那么这是一个循环循环。保护简单地说,如果我们以前没有看到它,包括它,如果没有,请不要。

希望这有帮助!

编辑:我应该提到,为了模块化,您应该使用具有私有数据成员和方法的类。我已经在C中编程了一段时间,所以这就是为什么我没有在这里包含它们。你也不需要像这样简单的程序类。

由于您提出了我们的意见,因此该程序可以很快完成。此外,我不确定为什么你在C ++中使用字符数组时字符串是一个字符数组,并且可以这样访问。 Plus字符串有很多方法可供你使用。

而不是:

char b[kSize];

使用:

string b = "";
//Initialize it here.

这样做有一些好处。首先是我已经说过的内置字符串方法加上如果你使用boost你还有更多。其次,字符串本质上是动态的。如果你想使char数组更长,你必须将它复制到另一个更长的数组。

字符串只是将字符追加到最后。

string example += "a";

以下是我如何反转字符串:

string example = "pony";
string destination = "";
for(int i = example.length() - 1; i >= 0; i--)
{
    destination += example[i];
}
example = destination;

就是这样。原始字符串现在已反转。有人可能想检查我的代码,但没有编译器就无法确定。

这是编程的一个微妙之处,但是当您声明字符串目标时,请确保将其初始化为:

string destination = "";

否则任何东西都可能存在于其中。在波士顿这里,我们称它们为死松鼠。不惜一切代价避免它们。始终初始化变量。

总是在旁注,有趣的是你是一个汇编程序员,现在你正在用C ++编程。大多数人都去C,因为C只是对ASM的抽象。