1. 程式人生 > >C語言---關於scanf讀入字串的一些問題

C語言---關於scanf讀入字串的一些問題

scanf是C語言中常用的標準輸入輸出函式,它的常規用法是scanf(“輸入格式”,輸入地址),scanf從輸入緩衝區取入資料按照指定的“輸入格式”儲存到指定的“輸入地址”。
但是有一類問題通常令人頭疼,那就是字串的讀入,此處僅僅討論使用scanf讀取字串的一些問題。
理論上你只需要定義一個字元指標,然後scanf每次讀入字元儲存到該指標所指的儲存空間,之後指標值自動加1.
所以,我們就有了下面兩種讀入字串的辦法:

1.定義字元陣列

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    // your code goes here
char str[20]; scanf("%s",str); printf("%s",str); return 0; }

完美執行,但是得說明一點,這裡的字元陣列必須事先確定好長度,即得事先吧記憶體開闢好,不然執行肯定會出錯。
2.定義字元指標

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    // your code goes here
    char* str;
    scanf("%s",str);
    printf("%s",str);
    return
0; }

scanf既然可以在每次讀入一個字元之後,自動為指標+1,那麼我們自然而然就想到其實我們是可以定義一個字元指標,然後scanf就往這個字元指標中讀取字元,但是其實不然,執行一下就會發現這種情況是錯誤的,為什麼呢?
因為我們沒有為scanf輸入的指標申請儲存空間,scanf輸入的資料必須也只能存放到實現申請好的儲存空間,不然輸入的字元可能會覆蓋掉程式碼段或者其他一些地方的資料,引發未知的錯誤。
現在我們就試一試事先申請記憶體:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    // your code goes here
char* str=(char*)malloc(15*sizeof(char)); scanf("%s",str); printf("%s",str); return 0; }

完美執行。
簡單總結一下,那就是如果要使用scanf讀入字串,那就一定要事先為它申請足夠的記憶體空間。