簡體   English   中英

C++ 字符串輸入

[英]C++ string input

我的書上說,如果我想讀取一個最大長度為 40 個字符的字符串,我必須聲明一個長度為 41 的變量,但它沒有說明原因。

char name[41];
cin >> name;
cout << name << endl;

我知道這是一個新手問題,實際上我是 C++ 新手。

我希望你能幫助我。 謝謝。

編輯:

感謝您的回答,我沒想到在這么短的時間內提供了這么多重要的信息。

  1. 誰負責在 char 數組的末尾插入 NULL 終止符?

  2. 按 Enter 后“\\n”會發生什么?

再次感謝。

使用std::stringcin讀取。 那么您不需要提前知道您的緩沖區需要多大。

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++ 中 string 和 char[] 類型之間的區別

答案是存儲在字符數組中的字符串,即原始字符串,以空字符('\\0') 終止。 該控制字符表示字符串的結束。 這個終止符很有用,因為不需要顯式存儲字符串的長度。 它也很有用,因為可以放入數組中的任何長度的字符串都是允許的。 在這種情況下,為字符串的末尾添加一個標記很有用。 這個問題應該被證明有助於進一步理解這個主題。

C 風格的字符串是一個由char的數組,其末尾由一個NUL終止符(即所有位都設置為0char )標記。

因此,字符串"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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM