C語言輸入一個字符串的方法有哪些
用scanf輸入字符串(有限制)
整個字符串處理
在
scanf()
和printf()
函數(shù)中,%s
指的就是字符串
所以我們就可以使用scanf("%s",str)
和printf("%s",str)
從鍵盤處讀取字符串并將字符串打印出來
代碼如下:
int main() { char str[10] = { 0 }; scanf("%s", str); printf("%s", str); return 0; }
這里要注意的一點是:在
scanf
函數(shù)中,后面的參數(shù)必須是一個地址,如輸入一個整形變量:scamf("%d",&a)
,都需要進行&
取地址操作
但是數(shù)組名就已經(jīng)是地址了(詳解請點擊觀看我的一篇關(guān)于數(shù)組名到底是什么的文章)
所以直接用數(shù)組名即可,不用進行取地址
如果我們輸入一個連續(xù)的字符串如:
abcde
,這段代碼會正常運行
然而,如果輸入一個非連續(xù),也就是中間有空格的字符串時,代碼只會打印出第一個空格以前的內(nèi)容
這是因為在鍵盤與scanf
函數(shù)中,存在一個輸入緩沖區(qū),從鍵盤輸入的內(nèi)容會存放到這個緩沖區(qū)中
而
scanf
并不會讀取走空格,它只能讀取走字符以及字符串
例如當從鍵盤輸入字符串abc 123
(注意abc
與123
之間是有一個空格的),在緩沖區(qū)中如圖:
scanf
首先會將字符串abc
取走,然后在abc
后面有一個空格,scanf
無法讀取走空格,所以雖然從鍵盤輸入abc 123
,但是最后只有abc
被存放在了str
中
所以最后只輸出了abc
總結(jié)一下scanf
:
輸入值之前的空白(空格、制表符、換行符)會被跳過,輸入值之前的空白表示結(jié)束。因此,用%s格式碼輸入字符時,中間不能包括空白
這里注意的是:前面講的
scanf
無法讀取輸入緩沖區(qū)中的空格甚至是回車,這里的scanf
指的是scanf("%s",str)
,只是函數(shù)中是%s
才無法讀取,而如果是scanf("%c",&character)
,輸入一個字符,對于空格和回車都是能正常輸入的,這里不要弄混
所以,用scanf
接受字符串是有局限性的。
逐個字符處理
前面已經(jīng)講了,用scanf
接受字符串是由局限性的,當字符串中含有空格,scanf
函數(shù)只能讀取第一個空格以前的字符串,但是如果非要用scanf
進行接受字符串,只能是逐個字符處理
代碼如下:
#include<stdio.h> int main() { char ch[10]; for (int i = 0; i < 10; i++) { scanf("%c", &ch[i]); } for (int i = 0; i < 10; i++) { printf("%c", ch[i]); } return 0;
這樣也可以進行對于字符串的輸入以及輸出
用getchar()輸入字符串
getchar
()與scanf
最大的區(qū)別就是,getchar
可以讀取走輸入緩沖區(qū)中的空格以及回車
這里的內(nèi)容我i之前有一篇文章進行了詳細講解,請點擊查看
代碼如下:
int main() { char str[20] = { 0 }; char ch = 0; while ((ch = getchar()) != '\n') { putchar(ch); } return 0; }
用gets()輸入字符串(簡單快捷)
這里介紹一個新的函數(shù)
gets()
,此函數(shù)在頭文件string.h
中,使用此函數(shù)需要加頭文件#include <string.h>
gets
函數(shù)的官方格式:char * gets ( char * str );
在參數(shù)列表中,需要傳一個字符型指針,也就是我們要輸入的字符串的名(數(shù)組的名)gets()
函數(shù)的主要作用就是接受從鍵盤輸入的一個字符串gets
當遇到換行符\n
或者EOF
時停止,并將讀取的結(jié)果存放在str指針所指字符數(shù)組中
#include <stdio.h> #include<string.h> int main() { char str[10]; printf("請輸入字符串"); gets(str); printf("請輸出字符串"); printf("%s", str); return 0; }
輸入帶有空格的字符串也可以正常輸出
其實還存在一個與gets
函數(shù)配套的函數(shù)puts
函數(shù),用來輸出字符,具體用法與printf
和putchar
無差別
#include <stdio.h> #include<string.h> int main() { char str[10]; printf("請輸入字符串: "); gets(str); printf("請輸出字符串: "); puts(str); return 0; }
gets函數(shù)與scanf、getchar的一些區(qū)別
在前面的
scanf
函數(shù)和getchar
函數(shù)中,回車都需要值得注意,但是在get
函數(shù)中,回車不作為讀取內(nèi)容,遇到回車時,系統(tǒng)自動用\0
代替回車\n
,所以輸入一行字符串后按下回車,就完成了一次輸入
gets
函數(shù)一遇到回車就結(jié)束,并把這個回車從緩沖區(qū)中移走,這點與scanf
不同,scanf
是遇到回車,空格就結(jié)束,但并不會將回車、空格從緩沖區(qū)中移走
gets
函數(shù)只會遇見回車時結(jié)束遇到空格、制表符都會正常讀取,而scanf
遇到空格、回車、制表符都會結(jié)束,getchar
遇到空格、回車、制表符都正常讀取
總結(jié)
到此這篇關(guān)于C語言輸入一個字符串的方法有哪些的文章就介紹到這了,更多相關(guān)C語言輸入字符串內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!