1. 程式人生 > >C語言輸入字串

C語言輸入字串

首先強調一點,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() 用於接收 回車符。