2013-08-17 19 views
3

我被要求採取從輸入的字符串(其可以是任何大小的),而無需使用C++ string。我想動態地爲char數組分配空間,並從SO本身獲得了以下實現。但我不確定這是否是一個好的實施。有沒有更好的實現,這不需要你輸入名稱中的元素數量?輸入串不使用C++串

#include<iostream> 
int main() 
{ 
    int size = 0; 
    std::cout << "Enter the size of the dynamic array in bytes : "; 
    std::cin >> size; 
    char *ptr = new char[size]; 

    for(int i = 0; i < size;i++) 
     std::cin >> *(ptr+i); 
} 
+0

到底爲什麼你一定要避免使用C++字符串?你可以自己實現這一點,但它可能相當於做std :: string所做的同樣的事情。 – arghbleargh

+0

@arghbleargh我知道實施它會很痛苦,它只是浪費時間,但在面試時我被問到了這一點。 –

+0

一個字符串通常在輸入文件中沒有預設長度。相反,它是由某些東西(空白,空字符,換行符或其他)分隔的。這個想法是,直到你達到分隔符時才知道長度。否則,讀取* any *長度的字符串與讀取某個*已知固定長度的字符串沒有什麼不同,並且將作業放在這樣一個簡單的問題上是沒有意義的。 –

回答

7

可能彎曲的規則(或我不明白的問題,但...)。無論如何,當有人用C++說「動態數組」時,我自然會想到一個向量。

#include <iostream> 
#include <vector> 
#include <iterator> 
using namespace std; 

int main() 
{ 
    vector<char> vec; 
    copy(istreambuf_iterator<char>(cin), 
     istreambuf_iterator<char>(), 
     back_inserter(vec)); 
    vec.push_back(0); 
    cout << vec.data() << endl; 
    return 0; 
} 

認爲會這樣做。


短版

#include <iostream> 
#include <vector> 
#include <iterator> 
using namespace std; 

int main() 
{ 
    vector<char> vec {istreambuf_iterator<char>(cin), 
         istreambuf_iterator<char>()} ; 
    vec.push_back(0); 
    cout << vec.data() << endl; 
    return 0; 
} 
+0

更好的是,初始化矢量而不是使用'std :: copy'。 – chris

+0

@chris。大聲笑。我總是忘記我能做到這一點。當我這樣做時,我的編譯器通常會對我說一個MVP,因爲我沒有像總的nuub那樣添加parens。 – WhozCraig

+0

是的,我不止一次地做過同樣的事情。統一的初始化幫助它。 – chris

-1

這裏有一個辦法做到這一點:

#include <iostream> 
#include <cstring> 

using namespace std; 

char *s; 
int buflen = 10; 
int len = 0; 

int main() { 
    s = new char[buflen]; 
    char c; 
    while (cin >> c) { 
    s[len++] = c; 
    if (len >= buflen) { 
     // need to allocate more space 
     char *temp = new char[buflen * 2]; 
     memcpy(temp, s, buflen); 
     delete s; 
     s = temp; 
     buflen *= 2; 
    } 
    } 
    s[len++] = '\0'; 

    cout << "Your string is: " << s << endl; 
} 
+0

所以很多事情錯了這個答案,我不知道從哪裏開始 –

+0

什麼是有些事情你不喜歡它 – arghbleargh

+0

手冊內存管理,'使用命名空間std;?','',分配規模的兩倍 –