C語言
一、輸入單個(gè)字符
1、scanf函數(shù)輸入單個(gè)字符
C語言scanf輸入時(shí)緩沖區(qū)問題
scanf函數(shù)是標(biāo)準(zhǔn)輸入流(從鍵盤接收數(shù)據(jù)),接收的數(shù)據(jù)放入輸入緩沖區(qū)中,其中就包括在鍵盤輸入的空格、回車這類字符,當(dāng)你用%d接收時(shí)是不會(huì)影響的,但是用%c就會(huì)產(chǎn)生錯(cuò)誤,這是因?yàn)樵?%c"輸入時(shí),空格和轉(zhuǎn)義字符均作為有效字符會(huì)被%c接收。
例如:
#include <stdio.h>
int main()
{
char a,b,c;
scanf("%c%c%c",&a,&b,&c);
printf("%c,%c,%c",a,b,c);
return 0;
}
運(yùn)行結(jié)果:
解決方法:
1.在接收第二個(gè)數(shù)之前清空緩沖區(qū)getchar(),getchar()是清空—個(gè)字符,如果緩沖區(qū)還有多余的字符則會(huì)被正常使用
例如:
#include <stdio.h>
int main()
{
char a,b,c;
scanf("%c",&a);
scanf("%c",&b);
printf("a=%c,b=%c",a,b);
return 0;
}
運(yùn)行結(jié)果:
這里我們預(yù)想的效果應(yīng)該是先輸入a的值回車后輸入b的值。但是通過運(yùn)行結(jié)果可以發(fā)現(xiàn),當(dāng)我們輸入a的值回車后,直接跳過了輸入b的值。這是因?yàn)閟cancf不是直接從鍵盤上獲取數(shù)據(jù),而是通過緩存區(qū)來獲取。scanf會(huì)先去看緩沖區(qū)中是否有數(shù)據(jù),如果有就直接拿走,并不需要鍵盤輸入。如果沒有就需要等待鍵盤輸入數(shù)據(jù)到緩沖區(qū),然后再從緩沖區(qū)中取走數(shù)據(jù)。
這里我們按了鍵盤上的1和回車,這時(shí)1\n(回車就是\n也算個(gè)字符)就被傳入了緩沖區(qū),而scanf函數(shù)只會(huì)取走\(yùn)n之前的數(shù)據(jù),緩沖區(qū)就遺留了個(gè)\n。當(dāng)?shù)诙€(gè)scanf函數(shù)開始讀取時(shí)就直接從緩沖區(qū)中取走了\n,就導(dǎo)致我們沒來得及輸入就直接跳過了。
getchar的作用是讀取一個(gè)字符,也是輸入函數(shù),所以和scanf讀取數(shù)據(jù)的過程一樣,都是從緩存區(qū)中獲取數(shù)據(jù)。為了不跳過第二個(gè)scanf,我們就可以在接收第二個(gè)數(shù)之前清空緩沖區(qū),用getchar將緩存區(qū)的\n取走。
#include <stdio.h>
int main()
{
char a,b,c;
scanf("%c",&a);
getchar(); // 清空緩存區(qū),把\n清除
scanf("%c",&b);
printf("a=%c,b=%c",a,b);
return 0;
}
運(yùn)行結(jié)果:
2.在%c之前加入空格,空格可以吸收回車符、空格。如果是在循環(huán)中多個(gè)scanf輸入多個(gè)字符,建議使用",“進(jìn)行隔開,并且在鍵盤輸入的時(shí)候也要使用”,"
例如:
#include <stdio.h>
int main()
{
char a,b,c;
scanf("%c %c %c",&a,&b,&c);
printf("%c,%c,%c",a,b,c);
return 0;
}
運(yùn)行結(jié)果:
2、getchar函數(shù)輸入單個(gè)字符
#include <stdio.h>
int main()
{
printf("Please input two character: ");
int ch=getchar(); //從緩存區(qū)中讀取1個(gè)字符并賦給ch
putchar(ch); //輸出字符
putchar('\n');
putchar(getchar()); //從緩存區(qū)中讀取1個(gè)字符并輸出
putchar('\n');
}
Please input two characters: ok↙
o
k
注:getchar()的返回值類型為int()
二、輸入字符串
1、scanf函數(shù)輸入字符串
#include <stdio.h>
int main()
{
char str[20]; //str是string的縮寫, 即字符串
printf("請(qǐng)輸入字符串:");
scanf("%s", str); /*輸入?yún)?shù)是已經(jīng)定義好的“字符數(shù)組名”, 不用加&,
因?yàn)樵贑語言中數(shù)組名就代表該數(shù)組的起始地址*/
printf("輸出的結(jié)果是:%s\n", str);
return 0;
}
例1.
請(qǐng)輸入字符串:天天開心
輸出的結(jié)果是:天天開心
例2.
請(qǐng)輸入字符串:i am working
輸出的結(jié)果是:i
出現(xiàn)例2的原因:
原因是用 scanf 輸入帶空格的字符串時(shí)系統(tǒng)將空格作為輸入字符串之間的分隔符。也就是說,只要一“敲”空格,系統(tǒng)就認(rèn)為當(dāng)前的字符串已經(jīng)結(jié)束,接下來輸入的是下一個(gè)字符串,所以只會(huì)將空格之前的字符串存儲(chǔ)到定義好的字符數(shù)組中。
那么這種情況該怎么辦?
解決方法:
以空格為分隔符,數(shù)有多少個(gè)字符串,有多少個(gè)字符串就定義多少個(gè)字符數(shù)組。比如“i am working”有兩個(gè)空格,表示有三個(gè)字符串,那么就定義三個(gè)字符數(shù)組:
# include <stdio.h>
int main()
{
char str1[20], str2[20], str3[20];
printf("請(qǐng)輸入字符串:");
scanf("%s%s%s", str1, str2, str3);
printf("輸出的結(jié)果是:%s %s %s\n", str1, str2, str3); //%s間要加空格
return 0;
}
請(qǐng)輸入字符串:i am working
輸出的結(jié)果是:i am working
2、gets函數(shù)輸入字符串
在<string.h>頭文件中
字符串輸入函數(shù)gets
格式:gets(字符數(shù)組)
功能:從鍵盤鍵入以回車結(jié)束的字符串放入字符數(shù)組中,并自動(dòng)加’\0’
說明:輸入串長度應(yīng)小于字符數(shù)組維數(shù),字符串中可以包含空格
字符串輸出函數(shù)puts
格式:puts(字符數(shù)組)
功能:向顯示器輸出字符串(輸出完,自動(dòng)換行,即用’\n’替’\0’)
說明:字符數(shù)組必須以’\0’結(jié)束文章來源:http://www.zghlxwxcb.cn/news/detail-407252.html
#include <stdio.h>
#include <string.h>
int main()
{
char str[20];
printf("請(qǐng)輸入字符串:");
gets(str);
printf("請(qǐng)輸出字符串:");
puts(str);
return 0;
}
請(qǐng)輸入字符串:so cute
請(qǐng)輸出字符串:so cute文章來源地址http://www.zghlxwxcb.cn/news/detail-407252.html
到了這里,關(guān)于C語言字符和字符串的輸入與輸出的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!