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

C++ char 陣列 vs std::string:scanf 無法讀取 string 型別

     編輯:程式設計綜合問答

問題現象

程式碼中 char type[10] 改為 std::string type 後,scanf("%s%d%d", type, &x, &y) 編譯/運行錯誤。

根本原因

scanf 是 C 標準庫函式,只支援 C 風格字串 (char*),不支援 C++ std::string。std::string 是類別封裝,記憶體佈局與 char* 不相容,無法直接作為 %s 目標緩衝區。

解決方案

方案一:保持 char 陣列配合 scanf (C 風格)


char type[10];
scanf("%9s%d%d", type, &x, &y);  // %9s 防緩衝區溢出
// 使用時
if (type[0] == 'A') { ... }

方案二:改用 C++ iostream (std::cin)


#include 
#include 
using namespace std;

string type;
cin >> type >> x >> y;  // 自動處理 string 讀取、空白分隔
// 使用時
if (type[0] == 'A') { ... }  // string 支援 [] 存取字元

方案三:scanf 讀入 char 陣列再轉 string


char buffer[10];
scanf("%9s", buffer);
string type = buffer;  // 隱式轉換

兩者核心差異對照

特性char type[10]std::string type
記憶體管理固定棧上陣列,手動管理動態堆上分配,RAII 自動管理
長度限制固定 9 字元 + '\0'動態擴充,理論無上限
安全性易緩衝區溢出邊界檢查 (at())、異常安全
功能豐富度需手寫/庫函式操作豐富成員函式 (find, substr, +, == 等)
C 函式相容直接相容需 .c_str() 或 data()
效能極快 (無分配)略慢 (小字串優化 SSO 可忽略)

最佳實踐建議

  1. C++ 專案優先用 std::string + iostream:型別安全、功能豐富、避免緩衝區溢出漏洞。
  2. 必須介接 C API/舊碼:在邊界用 string.c_str() (唯讀) 或 &string[0] (C++11 連續記憶體) 轉換。
  3. 競技程式/極致效能:char buf[SIZE] + scanf/printf 或快速 IO 模板。
  4. scanf 格式字串加寬度限制:%9s 防溢出,%s 不安全。

理解 scanf 僅支援 C 字串,std::string 是 C++ 類別,兩者不可直接互換,是 C/C++ 混合編程的基本認知。

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