2014-03-07 116 views
0

我正在做一個任務,其中第一部分要求我們提示用戶輸入一個字符串。我們需要把這個輸入作爲一個cstring存儲在堆上(不是std :: string,所以我們對cstring有了更好的理解)。我有一些工作正常:C++存儲字符串輸入爲cstring

char *input = new char[500]; 
cout << "enter a string: "; 
cin.getline(input, 500); 

但我覺得這是不是這樣做的問候創造的500數組,並希望他們不要超過該字符數限制一個很好的辦法。有沒有一種方法可以做到這一點,而不是製造一個可笑的大陣列,並可能不會使用任何附近的那麼多?這似乎是一種非常業餘的方式。我認爲這是可能的使用std ::字符串,但我必須使用cstring :(

+0

如果你不指定大小,然後將如何堆知道它應該做什麼的空間量爲您字符?它將在此分配500個字符的空間,並確保這個空間不被其他應用程序佔用。 – 2014-03-07 04:17:07

+0

'std :: string'的方式可能是通過分配一個小小的緩衝區,然後重新分配和複製一次,直到沒有更多的字符被讀取爲止,並且可能重複和重新分配多次。你可以用這種方式來實現它,但不值得麻煩。現在500字節的空間不是很大。 – Brian

+1

'std :: string'會自動調整大小以適應,所以顯然它會更容易使用。總的來說,你做這件事的方式是關於如何在沒有足夠了解輸入大小的情況下做得更精確。如果你想節省整體空間,你可以填充你的緩衝區,然後找到它的大小,並製作另一個完全相同大小的數組,將你的緩衝區複製到該數組,然後釋放緩衝區。 – IllusiveBrian

回答

1

C的方式將分配與malloc的緩衝區,讀取適當的字節數,並找出是否你有整個字符串如果你沒看過不夠,那麼你可以使用realloc的擴大緩衝區,多看看你離開的地方

0

,我們可以這樣做:建立動態字符串緩衝區YOURSELF

  1. 。分配一個堆內存(80就足夠了)
  2. 你可以自己控制輸入。你可以只讀取一個字符t 每一次流。如果內存的大小不夠 包含這個字符,只需分配足夠多的一個。
  3. 當您收到字符'\ n'(或其他人)時,請停止閱讀。

是的,這是C++庫的功能!緩衝區實際上是一個隊列。

0

C++更好的性能...所以這需要一個數組和指向數組的指針

#include <cstring> 
#include <iostream> 
#include <string> 
#include <stdio.h> 
using namespace std; 

int main() 
{ 
char name[100]; 
//string userInput[26]; 
int i=0, n=0; 
cout<<"your name? "; 
cin>>name; 
cout<<"Hello "<<name<< endl; 

char *ptr=name; 
for (i = 0; i < 20; i++) 
{ 
cout<<i<<" "<<ptr[i]<<" "<<(int)ptr[i]<<endl; 
} 
int length = 0; 
while(name[length] != '\0') 
{ 
    length++; 
    } 

      for(n=0; n<3; n++) 
        { 

       if (strncmp(ptr, "r2d2", 4) == 0) 
        { 
        cout << "you found r2d2bob" << ptr[i]; 
        } 

     } 
cout<<name <<"is"<<length<<"chars long"; 
}