c++
  • arrays
  • string
  • pointers
  • 2015-04-23 134 views -1 likes 
    -1

    我只需要用指針反轉我的char字符串。我怎樣才能做到這一點?我的代碼:帶指針的反向char字符串

    // this cannot be modified !!! 
    char s[10] = "abcde"; 
    char *pS; 
    
    // my code 
    pS = new char; 
    
    int count = 5; 
    
    for (int i = 0; i < 10; i++) 
    { 
        if (s[i] != '\0') // not null 
        { 
    
         pS[count - 1] = s[i]; 
         count--; 
        } 
    } 
    
    cout << "Reversed = " << pS; 
    

    有時候,如果工作得很好,我看到的只有5個字符,它們是相反的。但有時我會看到一些額外的字符(看起來像是臨時符號)。我錯過了什麼?謝謝!

    +2

    你不應該使用硬編碼的數字。使用strlen來查找長度。 – CreativeMind

    +2

    'pS = new char;'爲_single_'char'分配空間,而不是數組。 –

    +0

    你是否應該創建一個新的字符串或原來的位置?目前還不清楚「這是不能修改」的意思。 – molbdnilo

    回答

    0

    讀另一本書我完全理解指針和如何正確地分配內存後。這是我最後的代碼,正確扭轉字符的字符串數組(我不需要通用代碼,只是工作示例+無性病的方法逆轉):

    // not edited part - based on exercise (I mean I cannot change pS to char[5] etc. 
    char s[10] = "abcde"; 
    char *pS; 
    
    pS = new char[strlen(s) + 1]; // allocate correct memory size based on string size 
    
    cout << "Size is " << sizeof(pS) << endl; // just for testing 
    int count = strlen(s); // for iteration 
    
    pS[count] = '\0'; // last symbol must be '\o' (thanks to Mr.Yellow) 
    
    for (int i = 0; i < 10; i++) // 10 because array of char still has 10 elements 
    { 
        if (s[i] != '\0') // looks like "not garbage memory" 
        { 
         count--; 
         pS[count] = s[i]; // set correct value 
        } 
    } 
    
    cout << "Reversed = " << pS << endl; 
    

    謝謝所有誰幫助我!

    1

    只是給你的提示如何使用指針扭轉字符串:

    1. 取兩個指針前,其中前指向字符串後的第一個字符後指向字符串的最後一個字符。
    2. 檢查前部是否小於後部
    3. 如果是,則交換第一個和最後一個字符的值。如果不是,只需打印字符串。
    4. 遞增前指針和遞減後指針
    5. 重複從步驟2
    2

    您的字符數組的「s」包含10個字符,但只用「ABCDE」並初始化數組的第一個6個字符\ 0終止符。 當您遍歷整個數組時,您將訪問未初始化的字符。

    我還看到,你試圖寫入內存,你沒有分配。 您只爲您的「pS」指針分配1個字符的內存,但您嘗試訪問它的內存,就像它是for循環中的一組字符一樣。

    ,而不是使用硬編碼:

    int count = 5; 
    

    ,你也可以使用字符串函數的strlen()來確定C-字符串的長度。

    編輯(未經測試的代碼):

    char s[10] = "abcde"; 
    char pS[10]; 
    
    for (int i = 0; i < strlen(s); i++) 
    { 
        if (s[i] == '\0') // not null 
        { 
         // stop loop, as soon as you reach the end of the original string 
         break; 
        } 
        pS[strlen(s) - 1 - i]; 
    } 
    
    // now add the termination char \0 to your pS array 
    pS[strlen(s)] = '\0'; 
    
    cout << "Reversed = " << pS; 
    
    +0

    謝謝你的穿着。我如何爲5個字符分配內存? –

    +0

    @VladyslaveSemenchenko _「如何爲5個字符分配內存?」_像這樣'pS = new char [5];'不要忘記調用delete [] pS;',如果它不再被使用。 –

    +0

    轉到:嗯......仍然看到額外的符號。所以我的Ts字符串看起來像edcba,然後是一些臨時符號。看起來我錯了分配內存:( –

    相關問題