用C++语言实现Python的input()函数

数据结构 --线性存储结构-数组、链表、栈、队列 学习目标: 理解链表的实现原理,熟练链表的使用 学习内容: 1、 链表的基本理解 2、 链表的方法实现 3、 链表的实际用例 4、 文章总结 一、链表的基本理解 阅读详情

刚开始学编程的时候我使用了Python,用惯了Python的众多内建函数(所以它才会被称作为“具备电池的语言 battery-included language”),转型到C++的时候难免会有些不适应。今天就让我们实现一下那些“被抹灭掉的函数”,顺便帮一下像我一样刚刚踏入C++的世界的时候的初学者们吧。

为什么这是第一篇文章,实现的是input函数而不是最常用的print函数,或者是英语字母顺序开头的abs函数呢?这其实是有个人原因的:我初次踏进C++的土地时,第一次折磨我的函数便是input——我哪儿都找不到相应的实现。我觉得应该也有人跟我一样。

今天的目标

  • 能够使用C++实现Python内建的input()函数的所有功能。
    • 包括prompt提示符;
    • 回传值等等。

温故而知新

首先我们得知道Python的input函数带给了使用者什么的功能(说白了就是它是用来干什么的)。参考Python的官方文档,他写着:

如果存在prompt实参,则将其写入标准输出,末尾不带换行符。接下来,该函数从输入中读取一行,将其转换为字符串(除了末尾的换行符)并返回。当读取到EOF时,则触发EOFError。例如:

>>> s = input('--> ')
--> Monty Python's Flying Circus
>>> s
"Monty Python's Flying Circus"

如果加载了readline模块,input()将使用它来提供复杂的行编辑和历史记录功能。
引发一个审计事件builtins.input附带参数prompt。
在成功读取输入之后引发一个审计事件builtins.input/result附带结果。

Python的官方文档可能用了机器翻译,有些小伙伴们可能看不懂这种由英语硬生生翻译成中文的语文。让我们解刨一下原文,再把它用大白话说出来。首先让我们看看文档的原文:

If the prompt argument is present, it is written to standard output without a trailing newline. The function then reads a line from input, converts it to a string (stripping a trailing newline), and returns that. When EOF is read, EOFError is raised. Example:

>>> s = input('--> ')
--> Monty Python's Flying Circus
>>> s
"Monty Python's Flying Circus"

If the readline module was loaded, then input() will use it to provide elaborate line editing and history features.
Raises an auditing event builtins.input with argument prompt before reading input
Raises an auditing event builtins.input/result with the result after successfully reading input.

这什么意思呢?根据我们自己的翻译,其内容大意(大致上)是:

  • 如果prompt值非零,且内容为可打印(printable)字串(string)(也就是prompt可以用在print()函数里头),这个函数首先会打印prompt出来;
  • 然后Python会让你输入一行字串(记住,就一行),当你按下回车(Enter键/return键)输入就会立刻终止。
  • 最后这个函数会以字符串的形式返回所有你刚才所输入的字符,不包括结尾的回车字符/换行字符'\n'/'\r'。

剩下的可以管也可以不管。但是通常现在的终端机模拟APP(terminal-simulating application)已经帮你管好了。所以我们就一切从简。

最后让我们看看他的官方文档字串(docstring)的参数列表:

input(prompt='', /)

懂Python的朋友都应该知道,prompt参数后面的那个斜杠(slash)是为了美观而加上去的,直译器会把这个部分忽略掉。

着手开始实现

好了那么我们先准备一下我们的C++编译器,好让我们在编程完毕后顺利编译。不管你们用的是自由软体基金会的GCC/G++编译器也好,微软的Visual C++ (MSVC) 编译器也罢,只要支持c++11以及能够能产生可运行文件(executable)便行。我们这次实现对于编译器的要求并不是太高。

引入头文档

在C/C++的世界里,头文件决定一切。当你什么头文件(header file)都不引入(include)的时候,你顶多只能声明(declare)变量(variable)、函数(function)、类(class)等,做做四则运算(arithmetic operation)而不能输出结果。甚至Python、Ruby等语言是内建(builtin)的函数跟类,在C++中你也必须要#include <某个头文件.h>。

我们这次要引入的头文档也不算太多,如果是C++的话就只需要两个:

#include <iostream>
#include <string>

iostream,表面意思为“输入/输出流”(input/output stream),“流”是指从输入/输出设备中读写到的字符。这个头文档对一个名为basic_iostream的模板(template)定义,实现了格式化的输入/输出。

string,顾名思义,这个头文件定义了C++中字串符的操作,跟Python的内建str类有异曲同工之妙(不同点是使用C++的std::string类需要导入,也就是像Python的import指令差不多;Python允许程序自由使用单引号''/双引号""作为字串的定义工具,C++只允许双引号""因为单引号是用来定义字元char类的,这些我们以后有机会细聊)。

撰写程式代码

那么,我们现在终于可以开始变成了。

定义一个input()函数

Python的input()是在接收完用户的输入之后,以字符串的形式返回的嘛(如上所述)。C++中的字符串类是std::string,于是返回值也一定是std::string。

C++定义一个函数的方法是:[函数回传值] [函数名称,不能与其他变量、类、枚举、模板等有冲突] ( [参数类型,如有] [参数名称,如有。不能和其他参数名字一样,但是可以与变量、类等名称发生冲突,不过个人不建议这么做] ) { ... }。

所以,代码如下:

std::string input(std::string prompt = "")
{
}

由于Python input(prompt)的默认(default)参数(parameter)是空字串"",所以我们的C++程序也要效仿Python。

输出 prompt

不管程序有没有在呼叫(call)这个input()函数时有没有指明prompt参数,我们还是得打印prompt的。Python的内建打印方法print,可以用C++的std::cout代替(不过不完全能,以后我们逮住机会再实现一下print函数,还是挺有学习价值的),代码如下:

std::string input(std::string prompt = "")
{
    std::cout << prompt;
}

C++的std::cout默认输出后不带换行符,这对我们来说是个福音——因为不用再进行调整了。

到这里,程序应该能够把prompt打印至终端(或者其他输出设备)上。然后就没它什么事了。

留意这个时候千万不能使用input函数的回传值。由于我们没有明确地(explicitly)指明这个函数该回传什么。正常来说,回传值为void函数(也就是Python里的-> None函数)在呼叫完毕后会return;,也就是不回传任何值。直接访问这个函数的回传值会导致错误。但是由于我们主动把它设成一个回传值为std::string的函数,在编译时如果把它储存到一个变量还尚且没问题。但不管程序是直接还是间接地访问(access)这个变量(例如想知道其内容)或者这个函数的回传值,都会激发一个名为记忆体区段错误(segmentation fault)的运行时错误(runtime error)。程序戛然而止,不管现在正在运行什么重要的线程(thread)。显然我们跟用户都不想这种事情发生,也难怪编译器在编译时会蹦出来一条警告:Non-void function should return a value(“非无返回值的函数应该要返回一个值”)。

那,我们该怎么办呢?别急,我们现在正要去实现其功能。

输入功能实现

呼叫input()函数通常只有一个目的:输入字符。首先让我们看一看全部代码:

std::string input(std::string prompt = "")
{
    // Prints the `prompt` out in the console.
    std::cout << prompt;

    // Defines a variable, storing the user input.
    std::string source = "";
    // Retrieve the user input, by using the `std::getline` function and
    //     the `std::cin` method, with the new input value stored in the
    //     `source` variable.
    std::getline(std::cin, source);

    // And finally, return the `source` variable.
    return source;
}
  • 使用字符串类型的source变量来储存用户的输入字符。
  • 使用std::getline来获取用户的输入字符。
  • 最后,返回source。

小伙伴们可能会问:网上的教程都写着std::cin >> 什么什么的,为什么我们不用。这其实涉及到某些原因:getline把所有用户的输入全都变成字符串,刚刚好与我们今天的目标一样,也与Python的设计理念相似。反观std::cin,只要提供变量名称,你输入整数、浮点数都可以;这个并不利于我们的程序:隐式(implicit)类型转换令变量不易回传——它可以什么都是,并不单单局限于std::string类。

实现 main函数

不想某些脚本语言(scripting languages),在一个标准的C/C++程式里,你不能直接在全局命名空间域(global namespace)里头撰写程式码,否则会招惹错误。你一定得写个int main()函数的实现(一说是void main()也行,但是标准C/C++建议使用int作为回传值并且在函数的最后回传0),相当于Python的if __name__ == "__main__"了。在我们这里,我们效仿上面Python官方档案的标准例子:

int main()
{
    // Calls the input function.
    std::string s = input("--> ");
    // Prints the return value, with a trailing newline.
    std::cout << s << std::endl;
    // Returns 0 to the operating system.
    return 0;
}

记得在std::cout的后面加上std::endl,因为不想print函数,C++的std::cout不会帮程序自动加一个分行符号\n。你要自己加上去才行,否则会很难看。还有也要记得回传0给作业系统(或者那个线程)。

成果

现在让我们来看看成果:

完整的代码

代码如下图,如下:
完整的代码

运行效果

接下来,请把这些代码储存,然后使用编译器来编译(我使用的时g++编译器)。留意g++在微软的Windows操作系统中,默认它不在环境变量当中。如果是如此,你得输入这个编译器的绝对路径(absolute path),例如C:\<一大堆>\g++.exe什么的。或者你可以使用控制台把它加入至环境变量当中。具体办法可以网上搜搜看,这里就不作赘述了。
苹果macOS的用户也请留意,使用g++之前你一定要先装Xcode并且下载Xcode命令列界面工具(Xcode Commandline Tools),才能正常使用g++编译器。

废话不说,这是我们在Windows上运行的小成果:
C++编译成果可以与Python的作对比,发现其实差的不算太多。
Python的标准
其实也是一样的嘛。

后记

为什么不用using namespace std;

稍微懂C++的朋友一定见过这句指令:

using namespace std;

这句指令的意思是说,我们不用std命名空间了,我们把它里边所定义的所有变量跟函数都挪过去全局命名空间里。这样做乍看之下好像没有那么累赘了,确实是没那么累赘写代码也省事,但是它的道理跟Python的from 模组名称 import *是一样的:若不管理好引入的头文档资料,新来的定义会把之前的给覆盖掉。这样做非常麻烦,原本省事的目的没达到还惹了一连串的duplicate reference或者invalid name错误。最直白的例子是如果你用<windows.h>头文档,当中有min和max两个函数,是用来进行仅适用于Windows平台的大小比较作业。当你又手痒引入了<cmath.h>头文档,然后用using namespace std;作死,估计要么就是cmath.h里的min和max不能用;要么就是windows.h里的不能用,要么就是报错。还好这次的小项目十分小,声明一下也无妨,但我想表达的是这真不是编程上的一个良好习惯。

C/C++字符输入函数(详解) 文章目录C/C++字符输入函数(详解)1.常用函数(scanf函数)2.cin流控输入3. gets()函数4.getline()函数5.cin.get (char *str, int maxnum)特殊输入函数1> sprintf():2> sscanf():上章题解:问题:通过灵活输入原字符串,需要替换的字符换,需要被替换的字符串,并输出结果。 C/C++字符输入函数(详解) C/C++实现从终端(包括但不限于键盘,对于嵌入式设备可以是网口/串口)。 C/C++所提供的标准库提供了不下于一 阅读详情

相关推荐

(二)目标检测之 HOG+SVM 算法

文章目录一、概述二、方法概述三、积分图四、AdaBoost五、级联检测六、结果七、复现八、总结参考资料 一、概述   梯度直方图HOG(Histogram of Oriented Gradients)是法国人Dalal在2005年CVPR会议上提出的特征提取算法,并将其与 SVM 配合,用于行人检测。论文地址:Histograms of oriented gradients for human detection HOG有个优点,提取的边缘和梯度特征能很好的抓住局部形状的特点,且因是对图像做了Gamma

天青如水的博客 1万+

浅析 C++ 的输入输出

输入输出 什么是输入输出 输出(output) 输入(input) 输入输出流的头文件`iostream` 输出流类的抽象基类`ostream` 输入流类的抽象基类`istream` `ifstream` 类 `ofstream` 类 `fstream` 类

缺点灵气儿的笔记本 1067

【Godot】构建可维护的游戏工程 —— 项目代码组织结构

本文系统梳理了Godot引擎项目组织原则与架构模式,提出场景中心化、命名规范一致性和资源隔离三大核心原则。推荐按功能模块划分目录结构(如scenes/、entities/、systems/),采用snake_case命名避免跨平台问题,并通过.gdignore优化资源管理。文章详细解析了自包含场景设计、信号驱动解耦等架构技巧,以及团队协作中的版本控制策略,强调通过模块化设计平衡一致性与实用性。最终目标构建清晰可维护的项目结构,使资源定位和功能扩展更加高效。(148字)

qq_40205510的博客 1176

C++输入函数用法

c++输入函数用法 1、cin>> 用法1:最基本,也是最常用的用法,输入一个数字: #include using namespace std; main () { int a,b; cin>>a>>b; cout<<a+b<<endl; } 输入:2[回车]3[回车] 输出:5 注意:>> 是会过滤掉不可见字符(如 空格 ...

qq_41941017的博客 1960

从TL431光耦到集成隔离器:3种反激电源反馈方案全对比,你的项目到底该选哪个?

本文深入对比了反激电源设计中TL431光耦、集成隔离器和原边反馈三种主流反馈方案的优缺点,帮助开发者在电源设计中选择最适合的方案。从精度、成本、隔离等级等多维度分析,为反激式(Flyback)拓扑的应用提供实用选型指南。

weixin_30536513的博客 399

基于Python适用于YOLO目标检测算法的图片数据增强处理

为了增强模型的鲁棒性以及数据的丰富性,同 时为了防止由于数据过少发生过拟合,本设计对数 据集进行数据增强处理,包括随机亮度调节、随机 对比度调节、随机饱和度调节、加入高斯噪声、水 平翻转、运动模糊和旋转 15°

weixin_67136409的博客 699

C/C++学习笔记十二 Input and Output (I/O)(1)

输入和输出功能并未定义为核心 C++ 语言的一部分,而是通过 C++ 标准库提供(因此位于 std 命名空间中)。 包含iostream 库头文件并使用 cin 和 cout 对象来执行简单的 I/O。 istream 包含许多其他功能和上述功能的变体,它们可能有用,具体取决于您需要做什么。

学以致用 知行合一 1481

BAPI_OUTB_DELIVERY_CHANGE扩展指南:利用EXTENSION2与SMOD_V50B0001实现自定义字段更新

本文详细解析了如何利用BAPI_OUTB_DELIVERY_CHANGE的EXTENSION2参数与增强点SMOD_V50B0001,在不修改标准代码的前提下,安全、标准地更新SAP交货单的自定义字段。通过清晰的步骤指南和实战代码示例,帮助开发者掌握通过增强字段实现定制化业务需求的完整流程与调试技巧。

fanta的博客 451

编程语言 与 Windows API

编程语言的底层 与 Windows API 之间,存在着怎么样的猫腻呢?

因为热爱,所以坚持。 619

匹配博弈双边选择算法

刚学图论匹配方面的一些知识,记录下来。

ymengm的博客 2435

头歌OpenGauss数据库-G.视图的使用

OpenGauss数据库-G.视图的使用

python一生之敌的博客 1384

python和c++不定行的输入

python: Input=input() InputList=[] while Input!="": InputList.append(Input) Input=input() C++: #include <iostream> #include <string> #include <vector> #include <sstream> using namespace std; int main() { string str;

工科僧的博客 430

Raspberry Pi 4 ARM Trusted Firmware 技术解析

摘要: 本文详细介绍了在树莓派4(Raspberry Pi 4)上移植ARM可信固件(TF-A)的实现方案与安全考量。该移植专注于BL31功能,作为非安全世界(如Linux内核)的启动桥梁,支持加载EL2级别程序。文章分析了启动流程、内存映射设计,并对比了RPi3与RPi4的关键差异,指出当前版本缺乏硬件级安全内存保护的局限性。此外,提供了构建指南、配置说明及设备树自动修补的实现细节,强调通过config.txt简单配置即可启动64位内核。该方案充分利用树莓派原有GPU固件流程,兼顾兼容性与简易性。

Linux内核架构师 932

控制台输入

python: input() java: import java.util.Scanner; Scanner s1 = new Scanner(System.in); System.out.println("Please enter your year:\n"); int y = s1.nextInt(); System.out.println("Please enter your month:\n"); int m = s1.nextInt(); C: scanf() C+

qq_44778404的博客 312

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

[编程题0][剑指offer]字符串最后一个单词的长度

原题地址:https://www.nowcoder.com/questionTerminal/8c949ea5f36f422594b306a2300315da题意:计算字符串最后一个单词的长度,单词以空格隔开输入描述:一行字符串,非空,长度小于5000输出描述:整数N,表示最后一个单词的长度示例:输入:hello world输出:5 整体思路: 将输入的字符串按空格分隔,找到最后一个求其大小。...

weixin_30908649的博客 119

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【Python】input()函数用法小结

一:input()函数的输入机制 我们编写的大部分程序,都需要读取输入并对其进行处理,而基本的输入操作是从键盘键入数据。Python从键盘键入数据,大多使用其内置的input()函数。但是,不同于程序设计初学者常接触的C和C++,我们不需要在输入之时规定变量的类型。相反,我们可以非常便捷的使用a = input()对任何数据类型的变量a进行赋值,无论是int,float还是列表等等。但是这并不代表...

Darknight::的博客 17万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Python input()函数用法小结

一:input()函数的输入机制 我们编写的大部分程序,都需要读取输入并对其进行处理,而基本的输入操作是从键盘键入数据。Python从键盘键入数据,大多使用其内置的input()函数。但是,不同于程序设计初学者常接触的C和C++,我们不需要在输入之时规定变量的类型。相反,我们可以非常...

星卯教育-信奥教练tony 5311

input()函数及其各种用法

都知道C语言利用scanf()输入,C++利用cin输入,且它们都会遇到空格和换行会自动停止;但python里面的input()输入就比较特别点了,在输入的时候只以换行结束,也会许多注意点和规范。 Ⅰ. input()函数的基本使用: 由此不难看出: 在input()中加 ''的内容属于在输入前打印的内容,对输入有起到说明的作用,但不会影响输入的内容。 在input()前定义变量并赋值过程很简单 a = input()。 input()输入的内容属于 str 类型的数据。 input()输入时也可利用

Satur9的博客 5万+

【Python番外】关于 input() 与 print() 函数

在最近接触 Python 的这段时间内,遇到许多关于输出格式要求的题目(如十进制转二进制一类的)。在循规蹈矩的按照要求完成题目后,博主不免想起学习 C++ 的那些日子,尤其是接触标准库后,对于这类问题一般就是一行的事儿,根本不需要从原理上去一步一步实现。故博主十分贪心,想进一步了解在 Python 中是否也有类似于标准库这一类十分好用的 “工具”。

Akiiiira的博客 1687

Python内置函数input()详解 基本用法 类型转换 错误处理 总结——《跟老吕学Python编程》

input()函数是Python中与用户进行交互的一个强大工具。通过它,你可以创建出能够响应用户输入的程序,从而提供更加动态和个性化的用户体验。然而,由于input()函数总是返回字符串类型的数据,因此在处理用户输入时,你可能需要使用类型转换函数来将字符串转换为所需的类型,并使用错误处理机制来应对无效输入的情况。通过合理使用input()函数及其相关工具,你可以创建出功能强大且易于使用的Python程序。👨‍💻博主Python老吕评论,您的举手之劳将对我提供了无限的写作动力!🤞🔥。

Python老吕的博客 1206

如何在C++用Python的input和print?

在C++使用Python的print与input..

a4364634611的博客 2316

ChatLLM.cpp API绑定开发:如何集成Python、JavaScript和C语言

ChatLLM.cpp是一个纯C++实现的大型语言模型推理引擎,支持在本地计算机(CPU和GPU)上进行实时聊天。该项目提供了丰富的API绑定,让开发者能够轻松地将ChatLLM.cpp集成到Python、JavaScript和C语言等多种编程语言中。本文将为您详细介绍如何快速上手ChatLLM.cpp的API绑定开发,实现跨语言的大模型应用集成。😊 ## 📦 ChatLLM.cpp API

gitblog_01016的博客 327

pybind11_examples实战:01_py-list_cpp-vector教你实现Python列表与C++向量互转

pybind11_examples是一个专注于展示pybind11用法的示例项目,通过实际案例帮助开发者掌握Python与C++之间的数据交互技巧。本文将以01_py-list_cpp-vector模块为例,详细讲解如何实现Python列表与C++向量的高效互转。 ## 为什么需要Python与C++数据互转? 在实际开发中,Python以其简洁易用的特性适合快速开发和数据处理,而C++则在性

gitblog_00972的博客 826

Sublime text 3 - Python获取input的方法

Sublime Text3编写Python代码很方便,但是自带的Python编译方式无法获取input()函数的内容,为此,有2种方法可以获取input输入。一种是使用Windows自带的cmd命令行运行Python程序;另一种是使用插件SublimeREPL运行程序。

shenwanjiang111的专栏 3158

【Python 零基础入门】常用内置函数 再探

探索Python内置函数的多样性,在我们针对初学者的指南的第4-6部分中学习。了解如何操作列表、处理字符串和进行文件操作,以提升您的编码技能。通过实际示例和技巧,您将能够更有效地使用这些函数,实现更清晰、更高效的编程。非常适合希望掌握Python基础知识的初学者。

我是小白呀的博客 5188

input 函数的使用

python基础-----input输入函数

qq_64470623的博客 1655
下一篇: 《打造直译器》前言
brCreate
博客等级 码龄4年 14粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值