我刚刚完成了一个反转给定字符串的程序。现在,字符串长度必须为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;
}
答案 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的抽象。