c/c++输入方法及对比

C/C++ 输入方法简明指南

一、快速对比表

方法 功能 能否读空格 使用场景
C++ 方法
cin >> 变量 读取数据 ❌ 跳过 读取单个数字、单词
cin.get() 读取一个字符 ✅ 可以 密码输入、菜单选择
cin.getline(数组,大小) 读取一行到字符数组 ✅ 可以 读取固定长度字符串
getline(cin,字符串) 读取一行到string ✅ 可以 读取任意长度字符串(推荐)
C 方法
scanf("%d",&num) 格式化输入 ❌ 跳过 读取格式化数据
getchar() 读取一个字符 ✅ 可以 单个字符处理
fgets(数组,大小,stdin) 读取一行 ✅ 可以 安全的行输入

二、C++ 输入方法详解

1. cin >>- 最简单的输入

复制代码
复制代码
复制代码
int num;
string word;
cin >> num >> word;  // 输入"42 Hello"
// num=42, word="Hello"(不会读空格)

注意:遇到空格/换行就停止

2. cin.get()- 读取单个字符,包括空格,制表符,换行符等

复制代码
复制代码
复制代码
char ch = cin.get();  // 读取下一个字符,包括空格
cout << "你输入了: " << ch;

3. getline()- 读取整行(最常用!)

读取完一行后会自动删除缓冲区的换行符

复制代码
复制代码
复制代码
#include <string>
string line;
getline(cin, line);  // 读取整行,包含空格
cout << "你输入了: " << line;

优点:自动管理内存,不会溢出

4. cin.getline()- 旧式行输入

复制代码
复制代码
复制代码
char buffer[100];
cin.getline(buffer, 100);  // 读取最多99个字符

缺点:需要预先分配数组大小


三、C语言输入方法

1. scanf()- 格式化输入

复制代码
复制代码
复制代码
int num;
char str[20];
scanf("%d %s", &num, str);  // 读取整数和字符串

注意%s遇到空格停止

2. fgets()- 安全的行输入

复制代码
复制代码
复制代码
char buffer[100];
fgets(buffer, 100, stdin);  // 读取一行

优点:指定最大长度,防止溢出

3. getchar()- 单个字符

复制代码
复制代码
复制代码
char ch = getchar();  // 读取一个字符

四、常见问题解答

Q1: 如何读取带空格的整行文本?

A : 使用 getline(cin, str)(C++)或 fgets(buffer, size, stdin)(C)

Q2: cin >>后接 getline()出问题?

A : 在 cin >>后添加 cin.ignore()清除缓冲区:

复制代码
复制代码
复制代码
int age;
string name;
cin >> age;
cin.ignore();  // 清除换行符
getline(cin, name);  // 现在能正常读取

Q3: 哪种方法最安全?

A : C++用 getline(cin, str),C用 fgets(),它们都不会溢出缓冲区。


五、一句话选择指南

  • 读数字/单词 → cin >>scanf()

  • 读整行文本 → getline(cin, str)(首选)

  • 读单个字符 → cin.get()getchar()

  • 与C代码兼容 → 用C风格输入

六、最佳实践示例

复制代码
复制代码
复制代码
#include <iostream>
#include <string>
using namespace std;

int main() {
    // 读取数字
    int age;
    cout << "年龄: ";
    cin >> age;
    cin.ignore();  // 重要!清除换行符
    
    // 读取包含空格的字符串
    string name;
    cout << "姓名: ";
    getline(cin, name);  // 可以读"张三 李四"
    
    cout << "姓名:" << name << " 年龄:" << age;
    return 0;
}
相关推荐
czhc11400756634 分钟前
722:零侵入;DBG;
c#
炸膛坦客9 小时前
单片机/C/C++八股:(二十六)IIC 专题(I²C)---- 上集
c语言·c++·单片机
旖-旎9 小时前
LeetCode 518:零钱兑换||(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题
-银雾鸢尾-9 小时前
C#中的StringBuilder相关方法
开发语言·c#
Henry Zhu1239 小时前
C++中的特殊成员函数与智能指针
c++
-银雾鸢尾-10 小时前
C#中结构体与类的区别;抽象类与接口的区别
开发语言·c#
_wyt00112 小时前
多重背包问题详解
c++·背包dp
Ljwuhe13 小时前
C++——多态
开发语言·c++
越甲八千13 小时前
STL stack为何没有迭代器
c++
心平气和量大福大13 小时前
C#-WPF-Window主窗体
开发语言·c#·wpf