C語言輸入字符串
阿新 • • 發佈:2018-11-25
概念 收回 分享圖片 強調 scanf 接收 this ima which
首先強調一點,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() 用於接收 回車符。
C語言輸入字符串