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

C語言輸入字符串

概念 收回 分享圖片 強調 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語言輸入字符串