首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 動態字符數組賦值:可用 cin 輸入,但需分配足夠緩衝區並推薦 scanf_s 保證安全

     編輯:程式設計綜合問答

直接回答

可以使用 cin 向動態分配的 char* 數組輸入字符串,但必須滿足兩個前提:

  1. 分配足夠大小的緩衝區
  2. 防止緩衝區溢出

正確示例


#include <iostream>
#include <cstdio>  // scanf_s

int main() {
    const int MAX_LEN = 100;
    char* buffer = new char[MAX_LEN];  // 1. 分配足夠緩衝區
    
    // 方式一:cin 配合寬度限制 (C++11)
    // std::cin >> std::setw(MAX_LEN) >> buffer; // 需 #include 
    
    // 方式二:cin.getline (推薦,可讀取含空格行)
    std::cin.getline(buffer, MAX_LEN);
    
    // 方式三:scanf_s (最安全,微軟推薦)
    // scanf_s("%s", buffer, (unsigned)MAX_LEN);  // 不含空格
    // scanf_s("%[^\n]", buffer, (unsigned)MAX_LEN); // 含空格
    
    std::cout << "輸入內容: " << buffer << std::endl;
    
    delete[] buffer;  // 釋放內存
    return 0;
}

關鍵安全點對比

方法緩衝區保護讀取空格推薦場景
cin >> buffer無(危險)否不推薦
cin.getline(buf, size)有(限制size-1字符)是C++首選
scanf_s("%s", buf, size)有(必須傳size)否C風格、高性能
scanf_s("%[^\n]", buf, size)有是C風格讀整行
fgets(buf, size, stdin)有是跨平台C標準

現代 C++ 最佳實踐:用 std::string


#include <iostream>
#include <string>

int main() {
    std::string str;
    std::getline(std::cin, str);  // 自動管理內存、無長度限制、安全
    std::cout << "輸入: " << str << std::endl;
    return 0;
}

總結

動態char*數組可用cin.getline(buffer, size)安全賦值,前提是分配足夠緩衝區並傳入長度限制。微軟環境推薦scanf_s強制檢查長度。**現代C++首選std::string完全避免手動內存管理風險**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved