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() 用於接收 回車符。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM