最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言通過(guò)gets和gets_s分別實(shí)現(xiàn)讀取含空格的字符串

 更新時(shí)間:2021年12月20日 15:53:08   作者:ww171992  
在遇到包含空格的字符串輸入時(shí)該如何讀取呢?如果使用scanf以%s格式去讀取輸入的字符串,遇到空格就讀取結(jié)束了,顯然這樣是讀取不了的。本文就將介紹兩個(gè)可以對(duì)含空格字符串讀取的庫(kù)函數(shù)------gets和gets_s函數(shù),感興趣的可以了解一下

導(dǎo)讀

在刷Oj題時(shí),遇到包含空格的字符串輸入,如何讀取呢?如果使用scanf以%s格式去讀取輸入的字符串,遇到空格就讀取結(jié)束了,顯然這樣是讀取不了的。當(dāng)然,scanf也是可以讀取含空格字符串的,但操作起來(lái)相對(duì)較難,對(duì)C語(yǔ)言初學(xué)者并不友好。下面開(kāi)始介紹兩個(gè)可以對(duì)含空格字符串讀取的庫(kù)函數(shù)------gets和gets_s函數(shù)

gets函數(shù)

函數(shù)聲明

char * gets ( char * str );

函數(shù)介紹

頭文件

#include<stdio.h>

從stdin獲取字符串

從標(biāo)準(zhǔn)輸入(stdin)中讀取字符(包括空格,Tab),并將其作為C字符串存儲(chǔ)到str中,直到到達(dá)換行符或文件結(jié)尾。

如果找到換行符,則不會(huì)將其復(fù)制到str中。

在復(fù)制到str的字符之后,將自動(dòng)追加終止的空字符。

請(qǐng)注意,gets與fgets完全不同:gets不僅使用stdin作為源,而且在結(jié)果字符串中不包含結(jié)尾的換行符,并且不允許指定str的最大大小(這可能導(dǎo)致緩沖區(qū)溢出)。

參數(shù)

str

指向內(nèi)存塊(字符數(shù)組)的char*型指針,其中讀取的字符串作為C字符串復(fù)制。

返回值

成功時(shí),函數(shù)返回str(返回輸入字符串的起始位置)。

讀取結(jié)束(讀取到'\n')或讀取失敗時(shí),函數(shù)返回空指針(NULL)。

以下兩行了解即可

如果在嘗試讀取字符時(shí)遇到文件結(jié)尾,則設(shè)置EOF指示符(FEOF)。如果在讀取任何字符之前發(fā)生這種情況,則返回的指針為空指針(NULL)(str的內(nèi)容保持不變)。

如果發(fā)生讀取錯(cuò)誤,將設(shè)置錯(cuò)誤指示符(ferror),并返回空指針(NULL)(但str指向的內(nèi)容可能已更改)。

兼容性

C標(biāo)準(zhǔn)的最新修訂版(2011年)已明確將該功能從其規(guī)范中刪除。

該函數(shù)在C++中被禁止(如2011個(gè)標(biāo)準(zhǔn),它遵循C9+TC3)。

用法實(shí)例

(在DEV-C++編譯器環(huán)境底下,Visual Studio 2019并不支持gets函數(shù))

eg1:多組輸入含空格字符串,輸出其字符串長(zhǎng)度和字符串

#include<stdio.h>
#include<string.h>
 
int main()
{
	char str[100] = { 0 };
	int len=0;
	while(gets(str) != NULL)	//gets函數(shù)的多組輸入寫(xiě)法,讀取結(jié)束或失敗時(shí)返回NULL,注意和scanf函數(shù)的多組輸入結(jié)束或失敗返回值EOF區(qū)分開(kāi) 
	{
		len = strlen(str);
		printf("輸入的字符串%s長(zhǎng)度是%d\n", str, len);
	}
	
	return 0;
}

eg2:使用動(dòng)態(tài)內(nèi)存分配函數(shù)返回的指針接收輸入的含空格的字符串

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
 
int main()
{
	char* str = (char*)calloc(100, sizeof(char));
	//char* str = (char*)malloc(100 * sizeof(char));
	int len=0;
	
	if(str != NULL)
	{
		while(gets(str) != NULL)	//gets函數(shù)的多組輸入寫(xiě)法,讀取結(jié)束或失敗時(shí)返回NULL,注意和scanf函數(shù)的多組輸入結(jié)束或失敗返回值EOF區(qū)分開(kāi) 
		{
			len = strlen(str);
			printf("輸入的字符串%s長(zhǎng)度是%d\n", str, len);
		}
 
		
		free(str);
		str=NULL;
	}
 
	return 0;
}

eg3:由于目標(biāo)指針str不允許指定str的最大大?。ㄟ@里指內(nèi)存空間大?。ㄟ@可能導(dǎo)致緩沖區(qū)溢出)

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
 
 
int main()
{
	char str[3] = { 0 };//創(chuàng)建可以存放三個(gè)字符的數(shù)組 
	int len=0;
	//輸入字符串a(chǎn)bcdef(超過(guò)str數(shù)組長(zhǎng)度) 這種情況下的輸出依然可以得到期望的值。
    //但是,這也體現(xiàn)了gets函數(shù)在某些情況下可能會(huì)導(dǎo)致緩沖區(qū)溢出,這是一個(gè)不安全的函數(shù) 
	while(gets(str) != NULL)	//gets函數(shù)的多組輸入寫(xiě)法,讀取結(jié)束或失敗時(shí)返回NULL,注意和scanf函數(shù)的多組輸入結(jié)束或失敗返回值EOF區(qū)分開(kāi) 
	{
		len = strlen(str);
		printf("輸入的字符串%s長(zhǎng)度是%d\n", str, len);
	}
	
	return 0;
}

gets_s函數(shù)

函數(shù)聲明

char * gets_s( char * buffer,? size_t? sizeInCharacters );

函數(shù)介紹

頭文件

#include<stdio.h>

參數(shù)

buffer

輸入字符串的存儲(chǔ)位置,char*型指針。

sizeInCharacters

緩沖區(qū)的大小。

返回值

如果成功,則返回 buffer。 NULL 指針指示錯(cuò)誤或文件尾條件。 使用 ferror 或 feof 來(lái)確定發(fā)生了哪一個(gè)。

注解

gets_s 函數(shù)從標(biāo)準(zhǔn)輸入流 stdin 中讀取一個(gè)行并將該行存儲(chǔ)在 buffer中。 該行由所有字符組成,其中包含第一個(gè)換行符 ( " \n " ) 。 gets_s 然后,在返回行之前,將換行符替換為空字符 ( " \0 " ) 。 相反, fgets_s 函數(shù)將保留換行符。

如果讀取的第一個(gè)字符是文件尾字符,則空字符將存儲(chǔ)在 buffer 的開(kāi)頭,并返回 NULL。

_getws_s 是 gets_s 的寬字符版本;其參數(shù)和返回值都是寬字符字符串。

如果 buffer 為 NULL 或 sizeInCharacters 小于或等于零,或者如果緩沖區(qū)太小,無(wú)法包含輸入行和 null 終止符(小寫(xiě)的null即空字符 ( " \0 " )),這些函數(shù)將調(diào)用無(wú)效參數(shù)處理程序,如buffer中所述。 如果允許執(zhí)行繼續(xù),則這些函數(shù)返回 NULL 并將 errno 設(shè)置為 ERANGE。

以下兩行了解即可

在C++ 中,使用這些函數(shù)由模板重載簡(jiǎn)化;重載可以自動(dòng)推導(dǎo)出緩沖區(qū)長(zhǎng)度 (不再需要指定大小自變量),并且它們可以自動(dòng)用以更新、更安全的對(duì)應(yīng)物替換舊的、不安全的函數(shù)。 有關(guān)詳細(xì)信息,請(qǐng)參閱安全模板重載。

默認(rèn)情況下,此函數(shù)的全局狀態(tài)的作用域限定為應(yīng)用程序。 若要更改此項(xiàng),請(qǐng)參閱 CRT 中的全局狀態(tài)。

用法實(shí)例

(由于gets_s是Visual Studio 編譯器提供的安全gets函數(shù),因此僅在該編譯器環(huán)境底下可以使用)

eg1:多組輸入,多組輸出,求含空格字符串長(zhǎng)度,以char類型型數(shù)組存放

#include<stdio.h>
#include<string.h>
 
#define SZ 10  //根據(jù)實(shí)際輸入情況定義最長(zhǎng)字符串長(zhǎng)度+1即可,增加1是為了給'\0'留位置,這里最長(zhǎng)可輸入9長(zhǎng)度的字符串
 
int main()
{
    int len = 0;
    char str[SZ] = { 0 };
 
    while (gets_s(str, SZ) != NULL)//這里只能輸入不超過(guò)SZ-1長(zhǎng)度的字符串,否則程序崩潰,這也體現(xiàn)出gets_s函數(shù)的安全性極高
    {
        len = strlen(str);
        printf("輸入的字符串%s長(zhǎng)度為%d", str, len);
    }
 
    return 0;
}

eg2:多組輸入,多組輸出,輸入處理含空格的字符串,以動(dòng)態(tài)內(nèi)存分配函數(shù)形式

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
 
#define SZ 10  //根據(jù)實(shí)際輸入情況定義最長(zhǎng)字符串長(zhǎng)度+1即可,增加1是為了給'\0'留位置,這里最長(zhǎng)可輸入9長(zhǎng)度的字符串
 
int main()
{
    int len = 0;
    char* str = (char*)malloc(SZ * sizeof(char));
   // char* str = (char*)calloc(SZ, sizeof(char));
 
    while (gets_s(str, SZ) != NULL)//這里只能輸入不超過(guò)SZ-1長(zhǎng)度的字符串,否則程序崩潰,這也體現(xiàn)出gets_s函數(shù)的安全性極高
    {
        len = strlen(str);
        printf("輸入的字符串%s長(zhǎng)度為%d", str, len);
    }
 
    free(str);
    str=NULL;
 
    return 0;
}

學(xué)習(xí)小結(jié)

這兩個(gè)函數(shù)給我們提供了一種新的讀取字符串的方式,與scanf函數(shù)讀取字符串的區(qū)別就在于它們可以讀取含空格,Tab的字符串。解決關(guān)于字符串OJ問(wèn)題的關(guān)鍵一步,讀取輸入的字符串就得到有效的解決了。

在DEV-C++編譯器環(huán)境底下,直接調(diào)用gets函數(shù)即可;在Visual Studio 2019等VS編譯器底下,gets函數(shù)被gets_s函數(shù)取代,調(diào)用gets_s函數(shù)即可。

這兩個(gè)函數(shù),注意傳遞的參數(shù),在提交到OJ系統(tǒng)上時(shí),應(yīng)該使用gets函數(shù),因?yàn)镺J系統(tǒng)上的編譯環(huán)境其實(shí)是DEV。

給大家西大OJ上的一道處理含空格字符串的題目,OJ練習(xí):OnlineJudge

西大OJ時(shí)常會(huì)出現(xiàn)崩潰情況,我還是把題目放底下給大家吧。

到此這篇關(guān)于C語(yǔ)言通過(guò)gets和gets_s分別實(shí)現(xiàn)讀取含空格的字符串的文章就介紹到這了,更多相關(guān)C語(yǔ)言讀取含空格的字符串內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中 map的基本操作

    C++中 map的基本操作

    map是一類關(guān)聯(lián)式容器。接下來(lái)通過(guò)本文給大家分享c++中的map基本操作,需要的朋友參考下
    2017-05-05
  • C++超詳細(xì)講解構(gòu)造函數(shù)

    C++超詳細(xì)講解構(gòu)造函數(shù)

    C++的構(gòu)造函數(shù)的作?:初始化類對(duì)象的數(shù)據(jù)成員。即類的對(duì)象被創(chuàng)建的時(shí)候,編譯系統(tǒng)對(duì)該對(duì)象分配內(nèi)存空間,并?動(dòng)調(diào)?構(gòu)造函數(shù),完成類成員的初始化。構(gòu)造函數(shù)的特點(diǎn):以類名作為函數(shù)名,?返回類型
    2022-06-06
  • C++實(shí)現(xiàn)猜數(shù)字小游戲

    C++實(shí)現(xiàn)猜數(shù)字小游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)猜數(shù)字小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • C++中關(guān)于union的使用方法說(shuō)明

    C++中關(guān)于union的使用方法說(shuō)明

    這篇文章主要介紹了C++中關(guān)于union的使用方法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Qt使用隨機(jī)驗(yàn)證碼的實(shí)現(xiàn)示例

    Qt使用隨機(jī)驗(yàn)證碼的實(shí)現(xiàn)示例

    有時(shí)候在登錄界面需要驗(yàn)證碼功能,這樣能夠防止被惡意程序攻擊,本文主要介紹了Qt使用隨機(jī)驗(yàn)證碼的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • Dev C++編譯時(shí)運(yùn)行報(bào)錯(cuò)source file not compile問(wèn)題

    Dev C++編譯時(shí)運(yùn)行報(bào)錯(cuò)source file not compile問(wèn)題

    這篇文章主要介紹了Dev C++編譯時(shí)運(yùn)行報(bào)錯(cuò)source file not compile問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • VC WinExec打開(kāi)指定程序或者文件的方法

    VC WinExec打開(kāi)指定程序或者文件的方法

    使用WinExec命令打開(kāi)指定程序或者文件的參數(shù)說(shuō)明
    2008-11-11
  • Protocol Buffer技術(shù)深入理解(C++實(shí)例)

    Protocol Buffer技術(shù)深入理解(C++實(shí)例)

    C++實(shí)例Protocol Buffer技術(shù)詳解,感興趣的朋友可以了解下
    2013-01-01
  • 一篇文章帶你了解C++多態(tài)的實(shí)現(xiàn)原理

    一篇文章帶你了解C++多態(tài)的實(shí)現(xiàn)原理

    這篇文章主要介紹了C++多態(tài)的實(shí)現(xiàn)機(jī)制理解的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下,希望能給你帶來(lái)幫助
    2021-08-08
  • C語(yǔ)言異常處理機(jī)制案例講解

    C語(yǔ)言異常處理機(jī)制案例講解

    這篇文章主要介紹了C語(yǔ)言異常處理機(jī)制案例講解,本文講解了異常處理機(jī)制所用的函數(shù)和具體的代碼實(shí)現(xiàn)等,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評(píng)論

鹤山市| 祥云县| 万荣县| 阜南县| 桃园县| 尚义县| 定边县| 洪泽县| 固原市| 兴业县| 绥棱县| 阿拉尔市| 马关县| 济源市| 信丰县| 黎城县| 亚东县| 密云县| 铁力市| 五指山市| 阜新市| 太仓市| 英德市| 新津县| 河津市| 二连浩特市| 秦皇岛市| 万载县| 澄迈县| 祁东县| 仪陇县| 阳山县| 阜城县| 偃师市| 鱼台县| 新建县| 梅河口市| 大城县| 三原县| 宁南县| 福清市|