c語言如何輸入帶\n和空格的字符串
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)文章
C#?CLR學(xué)習(xí)?C++使用namespace實(shí)例詳解
這篇文章主要為大家介紹了C#?CLR學(xué)習(xí)?C++使用namespace實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
使用Qt實(shí)現(xiàn)監(jiān)聽網(wǎng)頁是否響應(yīng)并導(dǎo)出Excel表
Qt導(dǎo)出數(shù)據(jù)到excel,方法有很多,下面這篇文章主要給大家介紹了關(guān)于使用Qt實(shí)現(xiàn)監(jiān)聽網(wǎng)頁是否響應(yīng)并導(dǎo)出Excel表的相關(guān)資料,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
如何基于C語言socket編程實(shí)現(xiàn)TCP通信
本文介紹了如何基于C語言socket編程實(shí)現(xiàn)TCP通信,下面小編來簡(jiǎn)單介紹下2019-05-05
基于C語言掃雷游戲的設(shè)計(jì)與實(shí)現(xiàn)
大家好,本篇文章主要講的是基于C語言掃雷游戲的設(shè)計(jì)與實(shí)現(xiàn),感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12

