字符串中的注意事項

在比較早的C/C++版本中,經常可以看到推薦使用gets函數來進行整行字符串的輸入,就像下面這樣的簡單寫法即可輸入一整行:

C++

gets(str);

但是當輸入的字符串長度超過數組長度上限MAX_LEN時,gets函數會把超出的部分也一并讀進來,并且會覆蓋數組之外的內存空間,這就導致了一定的安全風險,因此C++11標準將gets函數廢棄了,然后在C++14時將該函數移除,如果現在想要整行輸入的話,推薦使用cin.getline函數(見下文)。

下面對三種整行輸入方法進行解釋。

cin.getline:僅C++可用,C語言不可用。需要添加#include 頭文件,并且在頭文件后增加一行using namespace std;。然后我們可以像下面這樣使用,其中第一個參數是字符數組,第二個參數是最大允許讀入的字符個數,設置為字符數組的長度即可。
C++

cin.getline(str, MAX_LEN);

scanf("%[^\n]", str):C++和C語言均可用。原理是使用scanf的正則表達式輸入功能,其中%[^\n]的含義是 “只要不為\n,就一直讀入”,也就是說它會讀入到換行符結束(或者全部讀完),即實現了讀入整行的效果。關于正則表達式的內容留給有興趣的同學了解,這里就不展開了。需要注意,這種方式不會把碰到的換行符處理掉,導致連續輸入多行字符串的時候還要自己動手處理換行符,并不是很方便(可以參考 字符串輸入輸出II),因此一般不推薦使用這種寫法。

fgets:C++和C語言均可用。用法如下所示,其中第一個參數是字符數組,第二個參數是最大允許讀入的字符個數,設置為字符數組的長度即可,第三個參數是文件指針,對做算法題來說設置為stdin即可,表示標準輸入流。

C++

fgets(str, MAX_LEN, stdin);

但是fgets函數有個特點,就是它會把我們輸入的換行符也讀到字符數組里,這就給我們做算法題帶來一些麻煩(特別是要讀入多行字符串的情況,因為基本上的題都是不需要在字符數組的末尾加這個換行的),因此在使用fgets函數輸入后需要做額外處理,即把\n替換為\0,如下所示:

C++

fgets(str, MAX_LEN, stdin);
str[strcspn(str, "\n")] = '\0';

其中strcspn函數需要引入string.h頭文件,含義是在一個數組中尋找某個或某些字符(例如"abc"表示尋找字符’a’或字符’b’或字符’c’,"\n"表示尋找換行符),并返回第一個滿足的下標。注意不能用str[strlen(str) - 1] = '\0’的方式來實現,因為如果是讀入最后一行的話可能不是以\n結尾,這時候字符數組末尾不會有多余的\n。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/40997.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40997.shtml
英文地址,請注明出處:http://en.pswp.cn/web/40997.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL基礎篇(二)字符集以及校驗規則

在MySQL基礎篇(一)中,我們知道了如何創建數據庫,這篇文章帶大家了解創建的一些細節。 紅色框:可省略,作用如果存在相同的數據庫名稱,就不會再創建,反之,創建。 藍色框&…

uniapp 封裝請求

新建request文件夾 下新建index.js 和index.js 或者創建units文件放入index.js 和api文件夾放入index.js(api.js)//看公司規范 1. index.js // 全局請求封裝 // const base_url http://localhost:8080/devapi var base_url process.env.NODE_ENV development ? http://…

可用于多個微信管理的神器

以下僅是多微信聚合聊天管理界面: 可以在一個頁面上同時收發多個微信的消息,可以添加好友,通過好友請求。 可以修改昵稱,不受字數限制。 可以將常用圖片,文件等放入素材庫,方便聊天時查找和發送。 可以設置…

速盾:cdn 緩存圖片

現如今,互聯網已經成為我們日常生活中不可或缺的一部分。在我們使用互聯網時,經常會遇到圖片加載緩慢、文章打開慢等問題。為了解決這些問題,CDN(內容分發網絡)應運而生。CDN 是一種通過將數據緩存在世界各地的服務器上…

集群環境下,調用半數以上節點進行數據同步的實現

核心實現是使用CountDownLatch來實現的,先取集群節點總數一半以上數量的CountDownLatch 再發送請求調用其他節點,在這個過程中對于正常響應的節點進行latch.countDown(); 最后再統計數量是否為0再決定是否拋異常 // 請求參數final String content jso…

Java:封裝

文章目錄 一、概念二、實現三、測試四、總結 一、概念 在面向對象編程中, 封裝從字面上來理解就是包裝的意思,特點就是信息隱藏,防止該類的代碼和數據被外部類的代碼隨機訪問。 封裝的優點: 良好的封裝能夠減少耦合。 統一接口…

搜索旋轉數組

題目鏈接 搜索旋轉數組 題目描述 注意點 數組已被旋轉過很多次數組元素原先是按升序排列的若有多個相同元素,返回索引值最小的一個 解答思路 首先需要知道的是,本題數組中的旋轉多次只是將頭部的某些元素移動到尾部,所以不論怎么旋轉&am…

uni-app怎樣使用組件

在uni-app中使用組件,主要遵循以下幾個步驟: 創建組件文件:在UniApp項目中創建一個新的組件,通常將組件文件保存在components文件夾下。如果components文件夾不存在,需要先創建它。然后在components文件夾下創建一個新…

Pycharm python解釋器 unsupported python 3.1 解決

Pycharm 環境 unsupported python 3.1解決 1. 問題重現2. 原因分析3. 解決方法 1. 問題重現 之前使用Pycharm 2024.1.1的時候,環境配置的Python 3.11.9,現在改成使用Pycharm 2020.2.2,結果Python解釋器顯示“unsupported python 3.1”&#…

Java ORM框架FastMybatis踩坑

Java ORM框架FastmyBatis踩坑 問題:使用了FastmyBatis的saveOrUpdate方法,明明設置了主鍵的值且表中存在,但是依然執行insert操作。導致Duplicate PK。 原因:使用了其他第三方包的注解指定表的主鍵,沒有按照FastmyBat…

低音炮內存卡格式化后無法播放音樂文件

試了多次 不支持ntfs不支持exfat 僅支持fat32 FAT32與exFAT的區別主要體現在來源、單個文件限制、適用情況以及兼容性方面。12 來源: FAT32是Windows平臺的傳統文件格式,首次在Windows 95第二版中引入,旨在取代FAT16,具有良好的…

自動駕駛中的逆透視變換(Inverse Perspective Mapping,IPM)詳解

前言 IPM(Inverse Perspective Mapping,逆透視變換)圖的歷史可以追溯到計算機視覺和圖像處理領域的發展。逆透視變換是一種用于消除圖像中透視效應的技術,使得原本由于透視產生的形變得以糾正,進而更準確地描述和理解圖像中的場景。比如在行車中的車道線檢測,泊車中的常見…

陳志泊主編《數據庫原理及應用教程第4版微課版》的實驗題目參考答案實驗2

實驗目的 1.掌握在SQL Server中使用對象資源管理器和SQL命令創建數據庫與修改數據庫的方法。 2.掌握在SQL Server中使用對象資源管理器或者SQL命令創建數據表和修改數據表的方 法(以SQL命令為重點)。 實驗設備 操作系統:Win11…

使用Source Insight 4.0

一、使用書簽 二、添加文件 三、Search 3.1 替換所有變量 四、右鍵查詢 4.1 查看被調用的地方

Linux上腳本備份數據庫(升級版)

直接上代碼: #!/bin/bash# 配置部分 mysql_user"root" mysql_host"localhost" mysql_port"3306" mysql_charset"utf8mb4" mysql_defaults_file"/home/mysql/mysql_back/.my.cnf"backup_base_dir"/mnt/sdd/…

GRPC使用之HelloWorld

使用grpc的好處是提供高效的序列化能力,能夠跨語言進行調用。這一節我們來學習grpc的入門應用,整篇文章分成3部分: 接口定義,使用grpc的IDL,創建proto文件,編譯/生成grpc文件服務端開發,處理客戶端請求&am…

計算云服務1

前言 一直以來,計算資源都是整個企業業務系統發展所需的大動脈,沒有計算資源,企業業務就無法正常運行。在云計算的時代里,計算服務也是云服務中的第一大類服務,計算資源的重要性由此可見。本章,我們將帶領…

C++之do-while陳述

回圈是用來進行進行重復性的工作,典型的回圈會進行下列三項基本任務 1.控制變數初始設定2. 回圈結束條件測試3. 調整控制變數的值 關鍵字(keyword) do與while構成C 中回圈的一種,常用于后測式的回圈,意思是回圈會先進行第一輪,然后…

017-GeoGebra基礎篇-微積分函數求解圓弧面積問題

基礎篇慢慢的走進尾聲,今天給大家帶來一個小項目,是關于高中數學微積分部分的展示,這個項目主要包含了函數的介紹、函數與圖形繪制的區別、區域函數圖像的繪制、積分函數的應用、動態文本的調用、嵌套滑動條的應用等等,以及其他常…

基于Transformer神經網絡的鋰離子電池剩余使用壽命估計MATLAB實現【NASA電池數據集】

Transformer神經網絡 基于Transformer神經網絡的鋰離子電池剩余使用壽命估計是一種先進的方法,它利用了Transformer模型在處理序列數據方面的優勢。 Transformer能夠有效地捕捉時間序列中的長程依賴關系和非線性模式,相比傳統的基于循環神經網絡&…