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

C語言字串輸入與輸出函式

字串輸入

如果想把一個字串讀取到程式中,必須首先預留儲存字串的空間,然後使用輸入函式來獲取這個字串,C庫提供了三個讀取字串的函式:scanf()、gets()和fgets()。

建立儲存空間

可以通過陣列(char name[10])來分配儲存空間,也可以通過C語言動態記憶體分配函式來動態分配儲存空間。

char *name;
scanf("%s", name);
如果通過上面的程式碼來建立儲存空間,可能會通過編譯器,但是在讀入name的時候,name會覆蓋程式中的資料和程式碼,並可能導致程式異常終止。這個是因為scanf()把資訊複製到由name指定的地址中,而在這種情況下,引數是個未被初始化的指標
,name可能指向任何地方。

gets()函式

gets()(get string)函式對於互動式程式非常方便,它從系統的標準輸入裝置(通常是鍵盤)獲得一個字串。因為字串沒有預定的長度,所以gets()函式通過判斷遇到的第一個換行符(\n)結束輸入,按回車鍵可以產生這個字元。它讀取換行符之前(不包括換行符)的所有字元,並在這些字元後新增一個空字元(\0)

[[email protected] c]$ cat test1.c
#include<stdio.h>
#define MAX 81

int main(void)
{
    char name[MAX];
    char *ptr; //指向char的指標

    printf("Please input your name.\n");
    ptr = gets(name); //使用一個地址吧字串賦值給name
    //gets()函式使用return關鍵字返回字串的地址
    printf("name, %s\n", name);
    printf("ptr, %s\n", ptr);

    return 0;
}
編譯&執行:
[[email protected] c]$ gcc test1.c
/tmp/ccDJ9AHw.o: In function `main':
//因為gets()函式不檢查儲存區是否能夠容納實際輸入的資料,可以用後面的fgets()函式替換gets()函式
test1.c:(.text+0x1a): warning: the `gets' function is dangerous and should not be used. 
[[email protected] c]$ ./a.outPlease input your name.clefname, clef 
//這裡ptr和name的內容是一樣的ptr, clef
如果在gets()函式在讀取字串時出錯或者遇到檔案結尾,它就返回一個空(或0)地址,這個空地址被稱為空指標,並且stdio.h裡面定義的常量NULL來表示,可以用下面的程式碼來進行一些錯誤檢測。
while(get(name) != NULL)
也可以通過getchar函式來完成上面的錯誤檢測。
while((ch = getchar()) != EOF)
注意:空指標和空字元是不一樣的,不要混淆。空指標是一個地址,而空字元是一個char型別的資料物件其值為0,數字上都可以用0表示,但是概念不同:NULL是一個指標,而0是一個char型別的常量。

fgets()函式

因為gets()函式不會檢查儲存區是否能夠容納實際輸入的資料,多出來的字元簡單地溢位到相鄰的記憶體區,所以上面的程式碼在編譯的時候會有warning。fgets()函式和gets()函式的不同:

  • 它需要第二個引數來說明最大讀入字元數。如果這個引數值為n,fgets()就會讀取最多n-1個字元或者讀完一個換行符為止(因為會自動新增一個空字元(\n)),由這兩者中最先滿足的那個結束輸入
  • 如果fgets()讀取到換行符,就會把它存到字串裡,而不是像gets()那樣丟棄。
  • 它還需要第三個引數來說明讀哪一個檔案,從鍵盤上讀取資料時,可以使用stdin(代表standard input)作為引數,這個識別符號在stdio.h中定義。
[[email protected] c]$ cat test1.c
#include<stdio.h>
#define MAX 81

int main(void)
{
    char name[MAX];
    char *ptr;

    printf("Please input your name.\n");
    ptr = fgets(name, MAX, stdin);

    printf("name, %s\n", name);
    printf("ptr, %s\n", ptr);

    return 0;
}
編譯&執行:
[[email protected] c]$ gcc test1.c //這裡就沒有warning出現
[c[email protected] c]$ ./a.out
Please input your name.
clef
name, clef
//注意這裡的換行符,因為fgets()函式沒有丟棄輸入的換行符
ptr, clef

[[email protected] c]$

scanf()函式

scanf()函式可以使用%s格式來讀入一個字串,scanf()函式和gets()函式的主要區別在於如何決定字串何時結束。scanf()函式更基於獲得單詞(get word)而不是獲取字串(get string)。scanf()函式有兩種方法決定輸入結束,無論哪一種都是遇到的第一個非空白字元開始

  1. 如果使用%s格式,字串讀取到(但不包括)下一個空白字元(比如空格、製表符或換行符)
  2. 如果指定了欄位寬度,比如%10s,scanf()函式就會讀取10個字元或者直到遇到第一個空白字元,由二者最先滿足的那一個終止輸入

字串輸出

C語言有三個輸出字串的標準庫函式:puts()、fputs()和printf()

puts()函式

puts()函式使用很簡單,只需要給出字串引數的地址,它遇到空字元(\0)就會結束輸出(所以必須要有空字元)。puts()函式在顯示字串的時候,會自動在其後新增一個換行符(\n)。

[[email protected] c]$ cat test1.c
#include<stdio.h>
#define DEF "I am a #defined string."

int main(void)
{
    char str1[80] = "An array was initialized to me.";
    const char * str2 = "A pointer was initialized to me.";

    puts("I'm an argument to puts()."); //直接用字串做引數
    puts(DEF); //用巨集定義做引數
    puts(str1);
    puts(str2);
    puts(&(str1[5])); //必須用括號strl1[5],因為str1將會首先結合&,然後在[5]結合,將出錯
    puts(str2+4);

    return 0;
}
編譯&執行:
[[email protected] c]$ gcc ./test1.c
[[email protected] c]$ ./a.out
I'm an argument to puts().
I am a #defined string.
An array was initialized to me.
A pointer was initialized to me.
ray was initialized to me.
inter was initialized to me.

fputs()函式

fputs()函式puts()函式面向檔案版本,兩者主要的區別是:

  • fputs()函式需要第二個引數來說明要寫的檔案,可以使用stdout(standard output)作為引數來進行輸出顯示。
  • 與puts()函式不同,fputs()函式並不為輸出自動新增換行符。

讀取一行並把它回顯在下一行,用下面的兩種迴圈都可以辦到

char line[81];
while(gets(line)) //遇到檔案結尾,gets()函式就會返回空指標,迴圈結束
    puts(line);
char line[81];
while(fgets(line,81,stdin))
    fputs(line,stdout);

printf()函式

如同puts()函式一樣,printf()函式在輸出字串的時候同樣需要一個字串地址作為引數,但是printf()函式沒有puts()函式方便,但是它可以格式化多種資料型別,輸出的時候也不自動新增換行符。

相關推薦

C語言字串輸入輸出函式

字串輸入 如果想把一個字串讀取到程式中,必須首先預留儲存字串的空間,然後使用輸入函式來獲取這個字串,C庫提供了三個讀取字串的函式:scanf()、gets()和fgets()。 建立儲存空間 可以通過陣列(char name[10])來分配儲存空間,也可以通過C語言動態記憶

C語言程式設計--輸入輸出

C語言的輸入 所有的輸入都是依賴於C語言函式進行的,這個函式是C語言標準庫自帶的,定義在標頭檔案<stdio.h>裡面,所以,要想使用與輸入相關的函式,都需要包含這個標頭檔案 #include <stdio.h> 輸入函式gets 這是一個獲取輸入字串的函式,其定義如

C語言的基本輸入輸出函式(全解)

C語言的基本輸入與輸出函式 1.1.1 格式化輸入輸出函式   Turbo C2.0 標準庫提供了兩個控制檯格式化輸入、 輸出函式printf() 和scanf(), 這兩個函式可以在標準輸入輸出裝置上以各種不同的格式讀寫資料。printf()函式用來向標準輸出裝置(螢幕)

C++2-------結構體,輸入輸出函式

一、C語言與c++中的不同之:輸入與輸出C++中既可以使用C語言中的輸入輸出函式也可以用Cin和Cout進行輸入與輸出,不需要格式控制。# include<iostream> using namespace std; int main() { printf("h

總結:C語言字串輸入的三種方式(scanf("%c",array); scanf("%s",str); gets(array);)

1、以scanf("%c",&array);的格式輸入字串; 由於%c是輸入一個字元,若需要輸入字串時我們可以建立陣列或指標配合迴圈(while,do{}while,for)來達到目的。如下例利用do{}while及陣列來輸入字串,並重新輸出,以字元#為結束標誌: #includ

C語言編寫 輸入年月日,輸出這個日期的下一天的日期

#include <stdio.h> main() { int year,month,day,flag=0; m: printf("Please input year month day:"); scanf("%d%d%d",&year,&

C語言字串轉整數atoi函式

/*字元轉整數(包括負數) */ #include<stdio.h> int atoi(char *string)     {int value=0,flag=0;while((*stri

c語言不定引數printf函式的實現

    今天學習了C語言不定引數,C語言中的不定引數主要靠<strarg.h>這個標頭檔案實現,這個標頭檔案包含了va_list()、va_start()、va_end()三個巨集,其用法為先宣告一個va_list型別的變數,它用於訪問引數列表未確定的部分。這個變

c語言==系統呼叫函式的區別(28)

系統呼叫與庫函式的區別? (1)庫函式是語言或應用程式的一部分,而系統呼叫是核心提供給應用程式的介面,屬於系統的一部分 (2)庫函式在使用者地址空間執行,系統呼叫是在核心地址空間執行,庫函式執行

如何求C語言字串長度(strlen函式和sizeof關鍵字)

原文出處:http://blog.csdn.net/kstrwind/article/details/8036555 ------------------------------------------------------------------------------

C++學習筆記——輸入輸出

概念 C++輸入輸出包含以下三個方面的內容: 對系統指定的標準裝置的輸入和輸出。即從鍵盤輸入資料,輸出到顯示器螢幕。這種輸入輸出稱為標準的輸入輸出,簡稱標準I/O。 以外存磁碟檔案為物件進行輸入和輸出,即從磁碟檔案輸入資料,資料輸出到磁碟檔案。以外存檔案為

Python趣味入門3:變數、字串輸入輸出

安裝配置python環境完畢,非常有必要花十分鐘對一些基本概念:變數、數學字元、輸入、輸出等4個概念進行理解,下面通過簡單示例,深入瞭解python的基本語法。 本文的示例均在IDLE的命令列模式中完成。   任務:班德爾城的主人今天生日,需要一個python生日賀卡,快完成這個任務吧。 1、變數與

C語言輸入輸出總結

1. scanf輸入: 特點:除%c外,讀取輸入時會跳過非白字元前的所有空白字元,然後一直讀取字元,直到空白字元或正在讀取字元不匹配的字元.(不匹配的會丟入緩衝區.作為下一次輸入接收的字元). 技巧: ①:把*放在%和轉換字元之間時,可以讓scanf()跳過相應輸出項. 比如:sca

C語言輸入三個字串,由小到大排序輸出

仔細觀察下面程式: #include <stdio.h> #include <string.h> void swap(char *p1,char *p2) { char *ret = p1; p1 = p2;

C語言基礎:標準輸入輸出

        在前面內容中我們已經知道了使用printf函式來在標準輸出裝置上顯示一些內容,接下來我們要學習一些其它的輸入輸出函式,讓我們的程式可以通過標準輸入裝置(鍵盤)取得使用者的輸入內容,並在標準輸出裝置(顯示器)上顯示出來。        一、putchar和get

[c語言]檔案資訊輸入輸出

要求: 將學生資訊(姓名,年齡,學號,家庭住址)寫入檔案,並輸出某一學生資訊(比如最後一個學生) 程式中所涉及的函式如下: 1:檔案開啟函式:fopen(欲開啟的檔名稱or檔案路徑,哪種方式) 2:

C語言 基本輸入輸出函式

1 幾組常見的輸入輸出函式 在stdio.h標頭檔案中內建了幾種輸入輸出函式,如下列出: printf 與 scanf getchar 與 putchar gets 與 puts 相比之下 printf 與 scanf的功能最為強大,但操作稍顯複雜,

C語言輸入輸出函式

I/O函式的三種方式:單個字元,文字行,二進位制資料 單個字元 輸入函式: int getchar( void ); 從標準輸入裡讀取下一個字元,相當於getc(stdin)。返回型別為int型,為使用者輸入的ASCII碼,出錯返回-1。 int

C語言實現輸入一個數,輸出這個數的立方根

#include<stdio.h> int main() { double x,x1,x2,w; scanf("%lf",&x); x1=x; x2=(2.0*x1+x/(x1*x1))/3.0; w=(x2-x1)/x1; if(w&

C語言實現輸入一個數,輸出這個數的sin值

#include<stdio.h> double shang(double x,int n) { int i; double k=1; for(i=0;i<n;i++) { k=k*x; } return k; } int