C語言輸入字串
阿新 • • 發佈:2018-11-25
首先強調一點,C語言沒有字串的概念!所謂的字串實際上還是以陣列形式儲存的。
方法1 —— 通過"%s"輸入
優點:簡單明瞭,輸入字元只要不大於陣列長度都可以。
#include <stdio.h> int main() { char s[100]="\0";//陣列初始化 scanf("%s",s); for(int i=0;i<100;i++){//列印輸入的一串字元 printf("%c",s[i]); } }
輸入:asdfasdfasd12341234
輸出:asdfasdfasd12341234
方法2 —— 通過for迴圈輸入
缺點:輸入的數長度固定,並且空格和換行符都會被判定為輸入字元。
#include <stdio.h> int main() { char s[100]="\0";//初始化 for(int j=0;j<10;j++){//定義輸入10個字元 scanf("%c",&s[j]);//逐個獲取輸入字元(包括空格和換行符) } for(int i=0;i<100;i++){//列印輸入 printf("%c",s[i]); } }
輸入:asd 123 hjk
輸出:asd 123 hj
方法3 —— 通過gets()輸入
使用gets()應注意: gets() 函式從標準輸入讀入 一行文字,直到讀到 新行符 或 EOF 字元 之前,不會停止讀入文字。也就是:gets() 不檢查邊界。因此,當變數空間 小於 一行字串 時, 使用 gets() 會造成 溢位,程式出錯。
#include <stdio.h> int main() { char s[100]="\0"; //初始化 gets(s); //獲取輸入 for(int i=0;i<100;i++){ //列印輸入 printf("%c",s[i]); } }
執行結果:會提示 warning: this program uses gets(), which is unsafe.
原因就是:gets() 函式從標準輸入讀入 一行文字,直到讀到 新行符 或 EOF 字元 之前,不會停止讀入文字。也就是:gets() 不檢查邊界。因此,當變數空間 小於 一行字串 時, 使用 gets() 會造成 溢位,程式出錯。
那麼什麼時候會出錯呢?看下面這種情況
#include <stdio.h> int main() { int n=0; char s[100]="\0"; scanf("%d",&n); //獲取 n 的值 gets(s); //獲取 s 字元陣列 printf("%d\n",n); //列印 n 的值 for(int i=0;i<100;i++){ //列印 s 字元陣列 printf("%c",s[i]); } }
執行結果:
為什麼 gets()沒有被執行呢?
原因是在 gets() 之前有 scanf() ,當輸入5之後敲了回車(enter)然而回車並沒有沒有被n接收讓gets()給接收了,gets()接收回車之後就結束輸入了。
所以gets()並不是沒有執行而是接收了回車,解決辦法如下。
#include <stdio.h> int main() { int n=0; char s[100]="\0"; scanf("%d",&n); //獲取 n 的值 getchar(); //接收回車符 gets(s); //獲取 s 字元陣列 printf("%d\n",n); //列印 n 的值 for(int i=0;i<100;i++){ //列印 s 字元陣列 printf("%c",s[i]); } }
在 scanf() 和 gets() 之間插入 getchar() 用於接收 回車符。