gets fgets 區別

http://www.cnblogs.com/aexin/p/3908003.html

1. gets與fgets

  gets函數原型:char*gets(char*buffer);//讀取字符到數組:gets(str);str為數組名。

  gets函數功能:從鍵盤上輸入字符,直至接受到換行符或EOF時停止,并將讀取的結果存放在buffer指針所指向的字符數組中。

         讀取的換行符被轉換為null值,做為字符數組的最后一個字符,來結束字符串。

  注意:gets函數由于沒有指定輸入字符大小,所以會無限讀取,一旦輸入的字符大于數組長度,就會發生內存越界,

     從而造成程序崩潰或其他數據的錯誤。

  fgets函數原型:char *fgets(char *s, int n, FILE *stream);//我們平時可以這么使用:fgets(str, sizeof(str), stdin);

          其中str為數組首地址,sizeof(str)為數組大小,stdin表示我們從鍵盤輸入數據。

  fgets函數功能:從文件指針stream中讀取字符,存到以s為起始地址的空間里,知道讀完N-1個字符,或者讀完一行。

  注意:調用fgets函數時,最多只能讀入n-1個字符。讀入結束后,系統將自動在最后加'\0',并以str作為函數值返回。

2. 細節介紹

  1,上面說到gets函數無限讀取,沒有上限。但是有些資料介紹說它最多只能讀取1024個,所以我寫了下面代碼測試一下

   ?(有興趣的朋友可以測試一下(●'?'●))

復制代碼
 1 //測試gets最多讀取字符是否超過1024 
 2 #include <stdio.h>
 3 #include <string.h>
 4 
 5 int main()
 6 {
 7     char str[2048];       //聽說gets最多可以讀取1024個字符,我們設定一個2048的數組 
 8     gets(str);            //從鍵盤輸入大于1024個字符
 9     int cnt;
10     printf("cnt = %d", strlen(str));   //cnt的值就是數組元素個數,是否大于1024呢??? 
11     
12     return 0;
13 }
復制代碼

    經本人親自測試第一次cnt = 2003,第二次cnt = 2086,第二次程序最后崩潰了,但是不能說明gets的讀取上限為2086左右,

    因為程序崩潰是由于內存越界

  2,在來細說一下fgeis的用法,我們以char str[N];fgets(str, N, stdin);為例:

    fgets只能讀取N-1個字符,包括最后的'\n',讀完結束后系統將自動在最后加'\0'gets讀完結束后系統自動會將'\n'置換成'\0')。

    說到這里就有倆種情況了:

    一:當你從鍵盤上輸入<=N-1個字符(包括'\n')時,那么字符串str會以‘\n\0’結尾。這就造成了strlen(str)比你想象的大 1 ,

      當然你可以通過下面代碼將'\n'去掉。

1 if(str[strlen(str) - 1] == '\n') {      // 去掉換行符
2     str[strlen(str) - 1] = '\0';   
3 }

    二:當你從鍵盤上輸入>N-1個字符(包括'\n')時,那么字符串str會以'\0'結尾。

  3,在上面我們提到從鍵盤輸入字符大于N的情況,這時gets和fgets就又有一些區別了,我們通過以下代碼來測試一下:

復制代碼
 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 5
 4 
 5 int main()
 6 {
 7     char s1[N];
 8     char s2[N];
 9     fgets(s1, N, stdin);
10 //    gets(s1); 
11     if(s1[strlen(s1) - 1] == '\n') {      // 去掉換行符
12         s1[strlen(s1) - 1] = '\0';   
13     }
14 
15 //    fflush(stdin);                               //清空緩沖區
16     fgets(s2, N, stdin);
17 //    gets(s2);
18     if(s2[strlen(s2) - 1] == '\n') {      // 去掉換行符
19         s2[strlen(s2) - 1] = '\0';   
20     }
21 
22     printf("%s %s", s1, s2);
23     
24     return 0;
25 } 
復制代碼

    當我們輸入12345按下回車,直接就出來1234 5這樣的結果。是不是與我們預想的不一樣呢?我們單看結果,s1是1234

    s2是5。這是為什么呢?

    這就是fgets與gets的不同之處,我們第一個fgets只讀取了1234,將5'\n'放入緩沖區中,當程序運行到第二個fgets時,

    它就會直接從緩沖區讀取,直到遇到'\n'結束所以就會有這樣的結果,此時s1是1234'\0',s2是5'\0'.我們應該怎么解決這種問題呢?

    我們可以在第二個fgets前加一句fflush(stdin),它是清除緩沖區的作用,大家可以試試,我就不截圖了。

    上面我們是用fgets輸入的,現在我們換成gets來輸入,看看結果吧:

    說到這里就已經不是簡單的gets與fgets的問題了,這涉及到了我們從鍵盤讀入的數據在內存中是怎么顯示的了,所以我只簡單的說一下。

  在內存中s1是這樣排序的

?

  '\0'
  6  ?
  5
  4?
  3?
  2?
  1

    當s2輸入進來的時候會變成:

  ?'\0'
  6
5
4
3
  ?'\0'
  f
e
d
c
b
a

    所以輸出的時候就會s1輸出f,后遇'\0'結束,s2輸出abcdef,后遇'\0'結束。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384158.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384158.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384158.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Fliptile——搜索+二進制優化

【題目描述】 Farmer John knows that an intellectually satisfied cow is a happy cow who will give more milk. He has arranged a brainy activity for cows in which they manipulate an M N grid (1 ≤ M ≤ 15; 1 ≤ N ≤ 15) of square tiles, each of which is col…

掃雷

1.將掃雷界面看成一個二維數組,先對界面進行打印 2.置雷 3.排雷 4.對每次的結果進行游戲輸出 5.提醒用戶游戲輸贏 game.c #define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" //初始化 void init_board(char mine[ROWS][COLS], int rows, int cols, char set) {in…

C相關練習題

1.調整數組使奇數全部都位于偶數前面。 輸入一個整數數組&#xff0c;實現一個函數&#xff0c;來調整該數組中數字的順序使得數組中所有的奇數位于數組的前半部分&#xff0c;所有偶數位于數組的后半部分。 #include<stdio.h> void range(int arr[], int sz) {int left…

【C語言】單鏈表的所有操作的實現(包括PopBack、PushBack、PopFront、PushFront、Insert)

http://blog.csdn.net/hanjing_1995/article/details/51539563 [cpp] view plaincopy #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; //單鏈表的實現 #include<assert.h> typedef int DataType; typedef…

Shuffle'm Up——簡單模擬

【題目描述】 A common pastime for poker players at a poker table is to shuffle stacks of chips. Shuffling chips is performed by starting with two stacks of poker chips, S1 and S2, each stack containing C chips. Each stack may contain chips of several diff…

C++ explicit關鍵字詳解

http://www.cnblogs.com/ymy124/p/3632634.html 首先, C中的explicit關鍵字只能用于修飾只有一個參數的類構造函數, 它的作用是表明該構造函數是顯示的, 而非隱式的, 跟它相對應的另一個關鍵字是implicit, 意思是隱藏的,類構造函數默認情況下即聲明為implicit(隱式). 那么顯示聲…

Fire!——兩個BFS

【題目描述】 【題目分析】 看到題目后很清楚是兩個BFS&#xff0c;可是我覺得對于火的BFS可以轉換成判斷&#xff0c;我的做法是將火的位置全部記錄下來&#xff0c;然后判斷某個位置距離每個火的步數是否小于當前步數&#xff0c;可是錯了&#xff0c;還不清楚為什么&#x…

函數調用過程(棧楨)

棧楨 首先來看一段代碼 #include<stdio.h> int add(int x, int y) {int z x y;return z; } int main() {int a 10;int b 20;int ret add(a, b);printf("ret %d\n",ret);return 0; } 此處是為了給a,b分別開辟空間,這時棧楨如圖所示 兩條push命令將a,b變…

C++智能指針簡單剖析

http://blog.csdn.net/lanxuezaipiao/article/details/41603883 導讀 最近在補看《C Primer Plus》第六版&#xff0c;這的確是本好書&#xff0c;其中關于智能指針的章節解析的非常清晰&#xff0c;一解我以前的多處困惑。C面試過程中&#xff0c;很多面試官都喜歡問智能指針相…

非常可樂——BFS

【題目描述】 大家一定覺的運動以后喝可樂是一件很愜意的事情&#xff0c;但是seeyou卻不這么認為。因為每次當seeyou買了可樂以后&#xff0c;阿牛就要求和seeyou一起分享這一瓶可樂&#xff0c;而且一定要喝的和seeyou一樣多。但seeyou的手中只有兩個杯子&#xff0c;它們的容…

整型數據存儲

//代碼1 #include<stdio.h> int main() {char a -1;signed char b -1;unsigned char c -1;printf("a %d, b %d, c %d", a, b, c);return 0; } 1000 0000 0000 0001 -> -1源碼 1111 1111 1111 1110 -> -1反碼 1111 1111 1111 1111 -> -1補碼 對于…

聊聊gcc參數中的-I, -L和-l

http://blog.csdn.net/stpeace/article/details/49408665 在本文中&#xff0c; 我們來聊聊gcc中三個常見的參數&#xff0c; 也即-I, -L和-l 一. 先說 -I (注意是大寫的i) 我們先來看簡單的程序&#xff1a; main.c: [cpp] view plaincopy #include <stdio.h> #incl…

Pots——BFS

【題目描述】 You are given two pots, having the volume of A and B liters respectively. The following operations can be performed: FILL(i) fill the pot i (1 ≤ i ≤ 2) from the tap; DROP(i) empty the pot i to the drain; POUR(i,j) pour from pot i to pot j;…

HDU - 4578Transformation——線段樹+區間加法修改+區間乘法修改+區間置數+區間和查詢+區間平方和查詢+區間立方和查詢

【題目描述】 HDU - 4578Transformation Problem Description Yuanfang is puzzled with the question below: There are n integers, a1, a2, …, an. The initial values of them are 0. There are four kinds of operations. Operation 1: Add c to each number between ax …

[C++基礎]034_C++模板編程里的主版本模板類、全特化、偏特化(C++ Type Traits)

http://www.cnblogs.com/alephsoul-alephsoul/archive/2012/10/18/2728753.html 1. 主版本模板類 首先我們來看一段初學者都能看懂&#xff0c;應用了模板的程序&#xff1a; 1 #include <iostream>2 using namespace std;3 4 template<class T1, class T2>5 clas…

自定義類型: 結構體,枚舉,聯合

1.結構體 個人認為結構體和數組特別相似&#xff0c;只不過結構體和數組的區別在于結構體的成員可以是不同類型&#xff0c;而數組成員類型是相同的。 &#xff08;1&#xff09;結構體的聲明 struct tag {成員列表//至少得有一個成員 }值列表;//值列表可以省略 struct {int a…

詳解C++中的函數調用和下標以及成員訪問運算符的重載

http://www.jb51.net/article/78436.htm 這篇文章主要介紹了詳解C中的函數調用和下標以及成員訪問運算符,講到了這些二元運算符使用的語法及重載,需要的朋友可以參考下函數調用 使用括號調用的函數調用運算符是二元運算符。 語法 ?1primary-expression ( expression-list )備…

A計劃——BFS

【題目描述】 可憐的公主在一次次被魔王擄走一次次被騎士們救回來之后&#xff0c;而今&#xff0c;不幸的她再一次面臨生命的考驗。魔王已經發出消息說將在T時刻吃掉公主&#xff0c;因為他聽信謠言說吃公主的肉也能長生不老。年邁的國王正是心急如焚&#xff0c;告招天下勇士…

使用openssl的md5庫

http://blog.csdn.net/sinat_35297665/article/details/78244523 在linux機器上&#xff0c;有一個命令可以計算出文件的md5值&#xff0c;那就是md5sum&#xff0c;如果沒有的話&#xff0c;就需要安裝RPM包&#xff1a;coreutils。 現在我們使用openssl的庫也可以方便的計算出…

主席樹入門

今天學習了一下主席樹&#xff08;名字這么強的嘛&#xff09; 雖然直接理解起來不容易&#xff0c;但是這種解決問題的思想其實并不陌生。 我們可以首先來看維護整個區間第K大的線段樹 我們將[l,r]區間內數字的多少用線段樹進行維護&#xff0c;這樣的話為了求取區間第k大&…