2017-05-26 92 views
0

我們可以在C++中接受和打印這樣的字符串嗎? 此代碼無法正常工作。接受和打印一個字符串

#include<iostream> 
#include<string> 
using namespace std; 

main() 
{ 
string a;char ch; 
for(int i=0;i<5;i++) 
{cin>>ch; 
a[i]=ch; 
} 
a[5]='\0'; 
cout<<a; 

} 

我可以打印單個元素,如[1],a [2]等,但無法打印整個字符串。爲什麼?

+0

https://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice – ChemiCalChems

回答

0

如果你想採取一個字符串,你可以做到以下幾點。

#include <iostream> 

int main() { 
    std::string str; 

    std::getline(std::cin, str); 

    std::cout << str; 
} 

此外,C++會自動終止您使用的任何字符串文字。

+0

先生,謝謝你非常想回復,但我在末尾添加了一個以空字符結尾的字符串,但它不起作用,我們能不能訪問字符串的元素use []運算符嗎?我不是直接爲它添加元素? 而我綁定的問題的輸入涉及元素之間輸入的空間像1 2 3 4,所以如何接受這些元素並將它們存儲在一個字符串? –

+0

爲什麼你要使用一個字符串?爲什麼不使用向量並將數字推回給它? – ChemiCalChems

0

嗯,它並不是真正接近最佳實踐的地方,但要解決實際調整字符串大小所需的直接問題。

#include<iostream> 
#include<string> 

main() 
{ 
    std::string a;char ch; 
    a.resize(5); // <--- reserves memory 
    for(int i=0;i<5;i++) 
    { 
    std::cin>>ch; 
    a[i]=ch; 
    } 
    a[5]='\0'; //<-- unnecessary 
    st::cout<<a; 
} 

或者你可以追加字符

#include<iostream> 
#include<string> 

main() 
{ 
    std::string a;char ch; 
    for(int i=0;i<5;i++) 
    { 
    std::cin>>ch; 
    a+=ch; 
    } 
    std::cout<<a; 
} 
+0

先生,非常感謝您的回覆,但我們爲什麼要這樣做先生?不會自動處理內存並在必要時進行擴展? –

+0

@AjaySabarish當你使用'append'或'operator + ='或類似的東西時,但['operator []'](http://en.cppreference.com/w/cpp/string/basic_string/operator_at)doesn不做任何界限檢查 – PeterT

+0

難道你寧願使用'reserve'而不是'resize'?'resize'會初始化爲零,'reserve'只會保留空間而沒有初始化 –

-1

可以打印這樣

#include<iostream> 
#include<string> 
using namespace std; 
int main() 
{ 
string a;char ch; 
for(int i=0;i<5;i++) 
{ 
cin>>ch; 
a.push_back(ch); 
} 
a.push_back('\0'); 
cout << a; 
return 0; 
} 
+0

使用a.push_back(ch);而不是[i] = ch; – Amol

+0

然後相應地編輯你的答案,以免提供更多的誤解。 – ChemiCalChems

+0

非常感謝您的先生。 –

0

這裏真正的問題不在於你無法讀取或不能串打印字符串,是你正在寫入未分配的內存。 operator[],這是您在使用a[i]=ch之類的東西時所使用的內容,不會執行任何類型的邊界檢查,因此導致未定義的行爲。例如,在我的機器中,沒有打印任何內容。

總之,你需要確保你有空間來寫你的角色。如果你確信你要讀5個字符(並在結尾處增加一個\ 0,使其成爲6長),你可以做這樣的事情:

std::string a(6, '\0') 

如果你不能確定有多少將要閱讀的字符std::string已準備好根據需要分配空間,但您需要使用std::push_back才能爲其提供機會。你的循環的內容會是這樣的:

cin >> ch; 
a.push_back(ch); 

如果您不能確定在std::string對象是來自(如,這是接受std::string作爲參數庫代碼,你可以使用at(i)(例如,a.at(i) = ch而不是a[i] = ch),如果它超出範圍,將引發異常。