2012-11-03 24 views
-4

我剛剛完成了一個反轉給定字符串的程序。現在,字符串必須長度爲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

我不明白什麼是錯的?我是否應該僅在問題中提出意見? – ali8

+1

是的,答案是回答,而不是解釋你忘記解釋的問題。編輯您的原始問題。 – adripanico

+1

問題是您的代碼已完全取消註釋。我們怎麼樣(我們的意思是整個StackOverflow社區)應該知道代碼的每個部分是幹什麼的? – Jules

回答

3

您的代碼的一個大問題是模塊化問題。如果你注意到,你有很多東西硬編碼到你的代碼中。

例如:

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

而不必每次都去,如果你想改變它,使兩個文件,一個與實現(的.cpp)來設置這些字符數組的大小和一個與接口(.h)。 如果你通常是一個彙編程序員,你可能不熟悉這個,但基本上,.h文件是你聲明所有函數的地方,並且包含你將要使用的所有額外頭文件。在你的.cpp文件中你定義了所有的函數,這對你來說是個好主意,因爲你的所有代碼都是主要的,這使得它不是模塊化的,而且很難閱讀。

回到硬編碼問題,在頭文件中聲明一個宏。宏是一個預處理器命令,它告訴編譯器:「嘿,每當你在程序中的任何地方看到這個變量名,用它替換它」。

#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,你還有更多。其次是字符串本質上是動態的。如果你想讓字符數組變長,你將不得不將它複製到另一個較長的長度。

字符串只是追加字符到最後。

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僅僅是ASM的一個抽象,所以大多數都是C語言。

+1

+1如果只是花時間寫下它。這可能會變成一個在線編程課程...... :) – Axel

+0

哈哈感謝兄弟。 Upvote,如果你認爲它值得。也許我很快就會把它變成一個社區wiki。 – barndog