[英]C++ string input
我的書上說,如果我想讀取一個最大長度為 40 個字符的字符串,我必須聲明一個長度為 41 的變量,但它沒有說明原因。
char name[41];
cin >> name;
cout << name << endl;
我知道這是一個新手問題,實際上我是 C++ 新手。
我希望你能幫助我。 謝謝。
編輯:
感謝您的回答,我沒想到在這么短的時間內提供了這么多重要的信息。
誰負責在 char 數組的末尾插入 NULL 終止符?
按 Enter 后“\\n”會發生什么?
再次感謝。
使用std::string
從cin
讀取。 那么您不需要提前知道您的緩沖區需要多大。
std::string input;
cin >> input;
cout << intput;
如果你需要一個 C 風格的數組,你可以這樣做:
const char* cstyle = input.c_str();
如果使用 C 樣式字符串,則最后一個字符始終是空終止符'\\0'
以指示字符串的結尾。 了解字符序列的結束位置很重要。
一些例子:
char* text = "hello"; // the compiler puts an extra '\0' at the end
std::string str("hello"); // does not have a null terminator! (before C++11)
str.c_str(); // this returns "hello\0" with a null terminator
C++中有兩種聲明字符串的方式:
char name[41];
或者
string name;
它們之間的一個主要區別是字符數組的末尾總是有一個\\0
字符來表示它的結尾,因此需要一個額外的單元格。 使用string
會更方便,因為您不必關心字符串的長度。 (您還可以使用string
庫中的許多內置函數)
C 風格的字符串是一個由char
的數組,其末尾由一個NUL
終止符(即所有位都設置為0
的char
)標記。
因此,字符串"Hi"
在內存中看起來像這樣:
+-----+-----+-----+ | H | i | NUL | +-----+-----+-----+
正如您所注意到的,一個由 2 個字符組成的字符串( "Hi"
)實際上需要 3 個(即 2+1)個字符,包括NUL
終止符。
這就是為什么 40 個字符的 C 樣式字符串需要 41 個(即 40+1)個字符的數組的原因,因為它必須包含NUL
終止符的空間。
作為旁注,我建議在 C++ 中使用健壯且方便的字符串類(例如std::string
),而不是帶有NUL
終止符的原始C 樣式字符數組。
如果您使用字符串類,您將使您的代碼更簡單,並且您將幫助自己避免一些潛在的安全問題(例如緩沖區溢出),這些問題更可能發生在原始 C 樣式字符串中。
這適用於 C++ 中的字符串輸入:
#include <iostream> // For std::cin/std::cout
#include <string> // For std::string
....
std::string name;
std::cin >> name; // Input
std::cout << name << std::endl; // Output
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.