2015-07-11 91 views
-3

這是一個業餘愛好者提問。我搜索了關於這個主題的其他帖子,發現了很多結果,但我還沒有理解解決方案背後的概念。用指針反轉字符串

這是我C++書中的練習題。它沒有分配作業。 [說明] [1]。

WHAT我想這樣做:

string input; 
getline(cin, input); //Get the user's input. 

int front = 0; 
int rear; 

rear = input.size(); 

什麼問題要我做

string input; 
getline(cin, input); //Get the user's input. 

int* front = 0; 
int* rear; 

rear = input.size(); 

錯誤:類型的值「爲size_t」不能被分配給int類型的實體*

這對我來說很有意義,因爲您無法將int的「地址」分配給int值。 所以我的問題是:

  • 什麼是正確的方法來解決這個問題?我應該忘記初始化前端還是後端?只是一起避免這一切?如果是這樣,該解決方案的語法是什麼?
  • 這個問題爲什麼要我使用這樣的指針?很明顯,這是一個可怕的指針使用。沒有指針我可以在30秒內完成這個問題。這真的很令人沮喪。
  • 我並沒有真正看到EVER的優勢,除了像使用指針返回數組那樣使用指針外。

謝謝你們。我知道你喜歡幫助那些幫助自己的用戶,所以我首先對此進行了一些研究。我現在對指針的概念非常惱火,而僅僅使用實際變量本身。

帖子有關此主題的,我已經預先讀:

+0

開始提示:如果要使用指針反轉字符串,最好不要使用STL字符串,而要使用字符數組。把你的字符串放在這樣一個數組中,然後開始交換字符,第一次交換最後一次等等。所以你有兩個指針,一個從字符串的開始到結尾運行,另一個向後運行。指針是C++的核心。它們使您能夠構建非常有效的低脂肪數據結構,如樹木和網絡。 –

+1

本書討論C字符串,前面和讀取應該是'char *'。 – kiwixz

回答

3

string.size()不返回指針 - 它返回size_t。

要恢復一個字符串試試這個:

string original = "someText"; // The original string 
string reversed = original; // This to make sure that the reversed string has same size as the original string 

size_t x = original.size(); // Get the size of the original string 

for (size_t i = 0; i < x; i++)  // Loop to copy from end of original to start of reversed 
{ 
    reversed[i]=original[x-1-i]; 
} 

如果你真的(一些奇怪的原因)需要指針試試這個:

string input; 
getline(cin, input); //Get the user's input. 

char* front = &input[0]; 
char* rear = &input[input.size()-1]; 

,但我不會用三分球爲一個字符串。不需要它。

+0

.size()在做類似 時返回size_t string string =「CAKE」; int x; int x = word.size(); cout << x; 會打印4對嗎?那麼爲什麼size_t也被認爲是int? – Hatefiend

+0

@Hatefiend由於'size_t'是一個「typedef」別名爲整數類型。 –

+0

@Hatefiend:size_t可以被轉換爲int。不同之處在於int_在size_t是不安全的。 – 4386427

1

我來賓你可能不太明白這裏的問題。這個問題希望你複製一個C字符串,然後通過指針操作來反轉它。標準C中沒有課程。因此,C字符串與C++中的字符串類非常不同。它實際上是一個以字符'\ 0'結尾的char型元素數組。

瞭解了這一點後,您可能會開始在這裏瞭解問題。如果您想複製C字符串,則不能只使用str_a = str_b。你需要這裏的構造函數。但是,在純粹的C風格中,您應該首先爲該字符串請求內存空間(您可以在此處使用malloc),然後複製每個元素。例如,你想創建一個功能,使輸入字符串的副本,

#include <string.h> 

char *strcopy(char* str_in) { 
    int len = strlen(str_in); 
    char *str_out = (char*)malloc(len+1); 

    char *in = str_in; 
    char *out = str_out; 
    while(*in != '\0') { *out++ = *in++; } 

    return str_out; 
} 

正如你看到的,我們實際使用char*沒有int*這裏操作字符串元素。您應該首先區分指針(如in)和指針指向的元素(如*in)。

我會告訴你一個純粹的C風格的解決方案,你的問題,我希望這會幫助你理解它。 (你應該能夠編譯它無需修改)

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

char* strreverse(char* in){ 
    // length of input string 
    int len = strlen(in); 
    // allocate memory for string operation 
    char *out = (char*)malloc(len+1); 
    // initialize <front> and <end> 
    char *front = out, *end = out + len - 1; 

    char buffer; 

    // copy input string 
    for(int i = 0; i <= len; i++){ out[i] = in[i]; } 

    // reverse string 
    for(; front < end; front++, end--) { 
     buffer = *front; 
     *front = *end; 
     *end = buffer; 
    } 

    return out; 
} 

int main() { 
    printf("REVERSE >> %s\n", strreverse("Hello, World!")); 
    return 0; 
} 

這不是你們想用C++做在實際編程中,但是,我想這裏的問題是試圖讓你理解指針的機制。在這方面,原來的C風格會有很大的幫助。

+0

在你的複製函數中,爲什麼不能有這樣的:http://codepad.org/FM5MLkif – Hatefiend

+0

這是一個通用數組複製函數,必須指定數組的長度。但是,C字符串的長度可以通過'\ 0'結束來評估。此處的複製功能僅適用於C字符串,不適用於其他陣列。此外,在這裏,我使用'malloc'作爲C風格的新內存空間。因爲C不能使用變量來聲明一個數組。 –

+0

我現在明白了。謝謝! – Hatefiend