簡體   English   中英

字符數組的長度限制

[英]Length limit of array of characters

我的問題圍繞下面顯示的程序(環境是Mac Xcode)。

#include <iostream>
int main () {
    char nameOne [5];
    std::cin  >> nameOne; // input: BillyBobThorton
    std::cout << nameOne; // output: BillyBobThorton

    char nameTwo [5] = "BillyBobThorton"; // compile error, initializer string too long
    std::cout << nameTwo;
    return 0;
}

我有一個長度為5的char數組,因此我希望可以在此數組中存儲的最大字符數為4(加上空終止char)。 當我嘗試將字符串存儲到nameTwo變量時,確實如此。 但是,當我使用字符數組作為變量來存儲用戶輸入時,該數組的長度將被完全忽略,並且該數組似乎擴展為容納額外的字符。

為什么會這樣,並且也許有更合適的方法將用戶輸入存儲到字符數組中嗎?

它不會“似乎擴展”,而是會不安全地越過數組的邊界,從而可能並且將導致內存損壞。

有一些“安全”功能會限制用戶輸入的長度。 使用長度限制器( %xxxs ,其中xxx是最大長度)或Windows上的scanf_s查看scanf。

也許有一種更合適的方法來將用戶輸入存儲到字符數組中?

是! C ++中最合適的方法是使用std::string 這將防止您的用戶超出分配的緩沖區的末尾並破壞堆棧。 如果只想顯示一定數量的字符,則可以使用std::string::substr()限制輸出(或在某些驗證例程中std::string::substr() 這是一個例子。

#include <iostream>
#include <string>

int main ()
{
    std::string nameOne;
    std::cin >> nameOne; // input: BillyBobThorton
    std::cout << nameOne.substr(0, 5); // output: Billy

    const std::string nameTwo = "BillyBobThorton";
    std::cout << nameTwo.substr(0, 5); // output: Billy
    return 0;
}

當我們使用運算符>>(char *)時,std :: cin不知道緩沖區的大小。 它只知道它必須填充從給定地址開始的char數組。 當它填充一個char *時,它會讀取輸入,直到遇到換行符(\\ n)。

如果您想讀取用戶提供的輸入內容,則可以使用std :: string而不是char數組(std :: cin >>字符串;或std :: getline(std :: cin,string);也可以從輸入緩沖區中刪除換行符)。

如果要限制要讀取的字符數,則應使用std :: cin.get(char *,size)或std :: cin.get(streambuf&,size);

始終最好限制輸入長度,以避免讀取非常長的字符串(數千個字符或更多)。

C ++中最合適的方法是使用std :: string

對此進行擴展,無論緩沖區大小如何,從cin流到固定大小的緩沖區幾乎總是一種不好的做法。 這就是導致臭名昭著的緩沖區溢出的原因 來自標准輸入的數據可以是任何長度,您應該始終檢查要復制到的緩沖區是否足夠大,以容納要放入的緩沖區。

當您使用std :: cin和std :: string時,檢查緩沖區是否足夠大,並根據需要重新分配緩沖區,這一切都由您來完成。

話雖這么說,當然有一種方法可以限制提取多少cin,請參閱如何在C ++中設置流的最大讀取長度?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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