欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c語言如何輸入帶\n和空格的字符串

 更新時(shí)間:2025年07月04日 09:43:40   作者:愛吃芝麻湯圓  
這篇文章主要介紹了c語言如何輸入帶\n和空格的字符串問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

c語言輸入帶空格的字符串

例題引入~~

【題目?jī)?nèi)容】
編寫程序,輸入可能帶空格的字符串,計(jì)算并輸入其長(zhǎng)度(即字符個(gè)數(shù),含空格數(shù))。
字符串最大長(zhǎng)度不超過100。使用字符數(shù)組實(shí)現(xiàn),不使用字符串庫函數(shù)。
輸入 : 可能帶空格的字符串。
輸出:一個(gè)非負(fù)整數(shù),字符串的長(zhǎng)度。
樣例輸入:
I like C++.
樣例輸出:
11

思路:這道題要使用數(shù)組儲(chǔ)存輸入的內(nèi)容,判斷數(shù)組中“有用的部分”,統(tǒng)計(jì)后輸出即可

#include <stdio.h>
#pragma warning(disable:4996)//vs中這樣輸入避免scanf函數(shù)報(bào)錯(cuò)
int main()
{
	char a[100] = { 0 };
	scanf("%s", a);
	for (int i = 0; i <= 99; i++)
	{
		if (a[i] == 0 && a[i + 1] == 0 && a[i + 2] == 0)//這里取巧
		{     
			printf("%d", i);
			break;
		}
	}
	return 0;
}

如何判斷數(shù)組中有用的部分呢,我們知道,這樣對(duì)數(shù)組初始化后,全部?jī)?nèi)容均為\0,而我們?nèi)€(gè)巧,默認(rèn)用戶不會(huì)連續(xù)輸入一堆空格。所以如果連續(xù)三個(gè)數(shù)組的元素都是\0,我們覺得這時(shí)就算有用的部分結(jié)束了。

看起來沒毛病,那么我們跑一下試試(逝世)。

壞了,果然逝世了,輸入“I like C++.”,結(jié)果竟然是1。這不就寄了。

哪里出問題了呢?

分析一波,看來a[1]=a[2]=a[3]均為零,肯定是輸入出問題了。(你大可分步執(zhí)行一下)

scanf遇到\0就會(huì)讀取前面的內(nèi)容,于是a[0]還正常的讀入,scanf發(fā)現(xiàn)接下來一個(gè)是\0,就不干了,讀取結(jié)束,循環(huán)結(jié)束,a[1]--a[99]全是\0。裂開了!

 如果我們死腦筋,非要用scanf進(jìn)行輸入,可以!有辦法!

scanf("%[^\n]",str);

意思是:一直讀取,直到遇見\n。

nice~~

看下結(jié)果

//I like C++.
//11

其實(shí)還可以用gets,但是c++認(rèn)為gets不安全(我其實(shí)沒遇到過),并且題目不讓??!唉~

c語言如何輸入空格加回車的字符串

例題引入~~

【題目描述】
設(shè)有一篇文章,有3行文字,每行不超過80個(gè)字符。請(qǐng)統(tǒng)計(jì)出該文的大寫字母、小寫字母、數(shù)字、空格以及其他字符的個(gè)數(shù)。使用字符數(shù)組實(shí)現(xiàn),不使用字符串庫函數(shù)。
輸入:三行英文文字,可能有空格及數(shù)字、標(biāo)點(diǎn)等符號(hào)。
輸出:5個(gè)整數(shù),用空格隔開,分別表示大寫字母、小寫字母、數(shù)字、空格以及其他字符的個(gè)數(shù)。
【輸入輸出樣例】
輸入:
year 2019
Month 3
DAY 20!
輸出:
4 8 7 3 1

思路:由于scanf+%s沒法輸入二維數(shù)組(也可能是我菜不會(huì)用)。我們用三個(gè)一維數(shù)組實(shí)現(xiàn)。讀入,判斷,輸出,簡(jiǎn)介明了。

#include <stdio.h>
#pragma warning(disable:4996)
int main()
{
	char w[80] = { 0 };
	char m[80] = { 0 };
	char n[80] = { 0 };
	int a = 0, b = 0, c = 0, d = 0, e = 0;
	scanf("%[^\n]", w);
	scanf("%[^\n]", m);
	scanf("%[^\n]", n);
	for (int i = 0; i < 80; i++)//對(duì)第二行和第三行就不展示在這里了,太浪費(fèi)空間
	{
		if (65 <= w[i] && w[i] <= 90)
			a += 1;
		else if (97 <= w[i] && w[i] <= 122)
			b += 1;
		else if (48 <= w[i] && w[i] <= 57)
			c += 1;
		else if (w[i] == 32)
			d += 1;
		else
			if (m[i] != '\0')
				e += 1;
	}
	printf("%d %d %d %d %d", a, b, c, d, e);
	return 0;
}

對(duì)第二行和第三行的循環(huán)判斷就不展示在這里了,太浪費(fèi)空間

運(yùn)行一波逝世

好家伙,我一個(gè)回車下去,直接結(jié)束程序了!??!

補(bǔ)充知識(shí):

緩沖區(qū)

緩沖區(qū)是一塊內(nèi)存區(qū), 它用在輸入輸出設(shè)備和CPU之間,用來緩存數(shù)據(jù) 。目的是為了CPU使其能夠高效率工作。

你從鍵盤或是其他輸入設(shè)備上輸入的所有內(nèi)容(包括換行\(zhòng)n和空格\0)都會(huì)放在緩沖區(qū)中,隨后由編寫的函數(shù)讀取進(jìn)入程序中,緩沖區(qū)一般不可見。

scanf

遇到\0,\n,tab都會(huì)選擇停止從緩沖區(qū)讀取。

當(dāng)運(yùn)行這個(gè)程序時(shí),向緩沖區(qū)輸入真正的內(nèi)容是“year\02019\n”(回車即\n),第一個(gè)scanf讀取了“\n”前的所有內(nèi)容,然后保存到a中,第二個(gè)scanf也會(huì)選擇讀取了“\n”前的所有內(nèi)容(啥也沒有),第三個(gè)scanf也會(huì)選擇讀取了“\n”前的所有內(nèi)容(啥也沒有)。尷尬

下面給出n種辦法供你選擇~

scanf("%[^\n]\n", w);

scanf一直讀取,直到遇到\n停止讀取,然后把\n也讀走。

注意:如果你輸入“s\0s\n”,那么數(shù)組中分別為s,\0,s,\n.第四個(gè)是\n??!

scanf(" %[^\n]", w);

咳咳,我也解釋不清,看下面的注意

注意:如果你輸入“s\0s\n”,那么數(shù)組中分別為s,\0,s,\0.第四個(gè)是\0?。?/span>

scanf("%[^\n]", w);
getchar(); 

當(dāng)你輸入回車后,緩沖區(qū)還剩一個(gè)\n,getchar會(huì)讀取任意一個(gè)字符(包括tab,\0,\n),清空緩沖區(qū)了。

注意:如果你輸入“s\0s\n”,那么數(shù)組中分別為s,\0,s,\0.第四個(gè)是\0!!

綜合來講,第二種方法最可靠,甚至你可以在其他離譜的情況下使用。

某無聊的例子:

#include <stdio.h>
#pragma warning(disable:4996)
int main()
{
	char a[100] = {0};
	scanf(" %s", a);
	printf("%s", a);
	return 0;
}

scanf在%s前加了個(gè)空格,并不影響使用(你可以不輸入空格直接輸入字符串,跟scanf前沒有空格是一樣的),跟我們通常認(rèn)為的scanf即為嚴(yán)格的輸入不太一致。

所以你如果夠閑可以在每個(gè)scanf最前面都加上個(gè)空格,在緩沖區(qū)沒有任何內(nèi)容或者只有\(zhòng)n時(shí)是沒有關(guān)系的。

總結(jié)

用scanf函數(shù)輸入\n和\0,緩沖區(qū)最基本介紹。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論