c語(yǔ)言如何輸入帶\n和空格的字符串
c語(yǔ)言輸入帶空格的字符串
例題引入~~
【題目?jī)?nèi)容】
編寫(xiě)程序,輸入可能帶空格的字符串,計(jì)算并輸入其長(zhǎng)度(即字符個(gè)數(shù),含空格數(shù))。
字符串最大長(zhǎng)度不超過(guò)100。使用字符數(shù)組實(shí)現(xiàn),不使用字符串庫(kù)函數(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)用戶(hù)不會(huì)連續(xù)輸入一堆空格。所以如果連續(xù)三個(gè)數(shù)組的元素都是\0,我們覺(jué)得這時(shí)就算有用的部分結(jié)束了。
看起來(lái)沒(méi)毛病,那么我們跑一下試試(逝世)。
壞了,果然逝世了,輸入“I like C++.”,結(jié)果竟然是1。這不就寄了。
哪里出問(wèn)題了呢?
分析一波,看來(lái)a[1]=a[2]=a[3]均為零,肯定是輸入出問(wèn)題了。(你大可分步執(zhí)行一下)
scanf遇到\0就會(huì)讀取前面的內(nèi)容,于是a[0]還正常的讀入,scanf發(fā)現(xiàn)接下來(lái)一個(gè)是\0,就不干了,讀取結(jié)束,循環(huán)結(jié)束,a[1]--a[99]全是\0。裂開(kāi)了!
如果我們死腦筋,非要用scanf進(jìn)行輸入,可以!有辦法!
scanf("%[^\n]",str);意思是:一直讀取,直到遇見(jiàn)\n。
nice~~
看下結(jié)果
//I like C++. //11
其實(shí)還可以用gets,但是c++認(rèn)為gets不安全(我其實(shí)沒(méi)遇到過(guò)),并且題目不讓?zhuān)?!唉~
c語(yǔ)言如何輸入空格加回車(chē)的字符串
例題引入~~
【題目描述】
設(shè)有一篇文章,有3行文字,每行不超過(guò)80個(gè)字符。請(qǐng)統(tǒng)計(jì)出該文的大寫(xiě)字母、小寫(xiě)字母、數(shù)字、空格以及其他字符的個(gè)數(shù)。使用字符數(shù)組實(shí)現(xiàn),不使用字符串庫(kù)函數(shù)。
輸入:三行英文文字,可能有空格及數(shù)字、標(biāo)點(diǎn)等符號(hào)。
輸出:5個(gè)整數(shù),用空格隔開(kāi),分別表示大寫(xiě)字母、小寫(xiě)字母、數(shù)字、空格以及其他字符的個(gè)數(shù)。
【輸入輸出樣例】
輸入:
year 2019
Month 3
DAY 20!
輸出:
4 8 7 3 1
思路:由于scanf+%s沒(méi)法輸入二維數(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è)回車(chē)下去,直接結(jié)束程序了!??!
補(bǔ)充知識(shí):
緩沖區(qū)
緩沖區(qū)是一塊內(nèi)存區(qū), 它用在輸入輸出設(shè)備和CPU之間,用來(lái)緩存數(shù)據(jù) 。目的是為了CPU使其能夠高效率工作。
你從鍵盤(pán)或是其他輸入設(shè)備上輸入的所有內(nèi)容(包括換行\(zhòng)n和空格\0)都會(huì)放在緩沖區(qū)中,隨后由編寫(xiě)的函數(shù)讀取進(jìn)入程序中,緩沖區(qū)一般不可見(jiàn)。
scanf
遇到\0,\n,tab都會(huì)選擇停止從緩沖區(qū)讀取。
當(dāng)運(yùn)行這個(gè)程序時(shí),向緩沖區(qū)輸入真正的內(nèi)容是“year\02019\n”(回車(chē)即\n),第一個(gè)scanf讀取了“\n”前的所有內(nèi)容,然后保存到a中,第二個(gè)scanf也會(huì)選擇讀取了“\n”前的所有內(nèi)容(啥也沒(méi)有),第三個(gè)scanf也會(huì)選擇讀取了“\n”前的所有內(nèi)容(啥也沒(mé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)你輸入回車(chē)后,緩沖區(qū)還剩一個(gè)\n,getchar會(huì)讀取任意一個(gè)字符(包括tab,\0,\n),清空緩沖區(qū)了。
注意:如果你輸入“s\0s\n”,那么數(shù)組中分別為s,\0,s,\0.第四個(gè)是\0??!
綜合來(lái)講,第二種方法最可靠,甚至你可以在其他離譜的情況下使用。
某無(wú)聊的例子:
#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前沒(méi)有空格是一樣的),跟我們通常認(rèn)為的scanf即為嚴(yán)格的輸入不太一致。
所以你如果夠閑可以在每個(gè)scanf最前面都加上個(gè)空格,在緩沖區(qū)沒(méi)有任何內(nèi)容或者只有\(zhòng)n時(shí)是沒(méi)有關(guān)系的。
總結(jié)
用scanf函數(shù)輸入\n和\0,緩沖區(qū)最基本介紹。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
c++利用stl set_difference對(duì)車(chē)輛進(jìn)出區(qū)域進(jìn)行判定
這篇文章主要介紹了set_difference,用于求兩個(gè)集合的差集,結(jié)果集合中包含所有屬于第一個(gè)集合但不屬于第二個(gè)集合的元素,需要的朋友可以參考下2017-03-03
養(yǎng)成良好的C++編程習(xí)慣之內(nèi)存管理的應(yīng)用詳解
"養(yǎng)成良好的編程習(xí)慣"其實(shí)是相當(dāng)綜合的一個(gè)命題,可以從多個(gè)角度、維度和層次進(jìn)行論述和評(píng)判,如代碼的風(fēng)格、效率和可讀性;模塊設(shè)計(jì)的靈活性、可擴(kuò)展性和耦合度等等,要試圖把所有方面都闡述清楚必須花很多的精力,而且也不一定能闡述得全面2013-05-05
C語(yǔ)言 動(dòng)態(tài)內(nèi)存分配的詳解及實(shí)例
這篇文章主要介紹了C語(yǔ)言 動(dòng)態(tài)內(nèi)存分配的詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2016-09-09
C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單停車(chē)場(chǎng)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單停車(chē)場(chǎng)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
C語(yǔ)言實(shí)現(xiàn)逆序輸出詳細(xì)
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)逆序輸出。主要實(shí)現(xiàn)C語(yǔ)言實(shí)現(xiàn)對(duì)數(shù)組元素依次賦值然后按照逆序輸出,下面文章小編將詳細(xì)解說(shuō),需要的朋友可以參考一下2021-10-10
VSCode與Keil聯(lián)合開(kāi)發(fā)STM32的流程
這篇文章主要介紹了VSCode與Keil聯(lián)合開(kāi)發(fā)STM32的流程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
C語(yǔ)言基礎(chǔ)之malloc和free函數(shù)詳解
這篇文章主要介紹了C語(yǔ)言基礎(chǔ)之malloc和free函數(shù)詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04
C++11 算法std::copy_if 與 std::copy_n詳解
C++11新增std::copy_if與std::copy_n,前者條件篩選復(fù)制,后者固定數(shù)量復(fù)制,提升代碼可讀性與性能,適用于數(shù)據(jù)過(guò)濾及批量處理,需注意范圍重疊與目標(biāo)空間不足等陷阱,本文給大家介紹C++11算法std::copy_if 與 std::copy_n詳解,感興趣的朋友一起看看吧2025-07-07

