日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

由入门C语言题目浅析gets()函数的用法

發布時間:2023/12/31 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 由入门C语言题目浅析gets()函数的用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、背景

當執行下面的程序時,如果輸入ABC,則
知輸出結果是()
#include<stdio.h>
#include<string.h>
int main()
{
char ss[10] = “1,2,3,4,5”;
gets(ss);strcat(ss,“6789”);
printf("%s\n",ss);
return 0;
}

在逛論壇的時候遇到了如上的一個問題,目測應該是二級題庫或者水平考試的題目,
題目本身不難,我也順手給壇友回復了自己的看法:

沒曾想這個問題還沒有結束…


那么該怎么科學認識gets()這個函數呢?

二、曲徑探幽

1. 貧窮的困擾

根據學Python學Java的經驗,遇到問題,最簡單的解決辦法是查閱官方文檔。

讓我們來找找C語言的官方文檔;

哦?

點進去看看


貧窮是阻礙不了我們追求知識的,
既然沒有免費的官方標準文檔,
我們也不到處去找一些第三方文檔了,
讓我們自己來分析一下子(要找也能找到,主要是為了引入下一段分析源碼)
<本文發表于CSDN博客,由入門C語言題目淺析gets()函數的用法,https://blog.csdn.net/ftimes/article/details/106957922,轉載請注明出處>

2. 奮斗本身是一種幸福

大大教育我們:“幸福是奮斗出來的,奮斗本身是一種幸福。”

雖然沒有文檔,但是我們可以看看網上免費的一些教程有個大概了解


有了這個文檔,我們對gets有了大概了解,

下面我們需要自己奮斗一下,把握gets的一些特性

還是用剛剛的例子



可以看到,讀入了一個新字符串之后,ss的地址是沒有變的,并不是指向了一個新的字符串,
那么問題又來了,
abc是明顯覆蓋不了ss[10]的,那么其他位置的元素去哪里了呢?

我們來改一下代碼:
用了一下C++,所以需要加點頭文件

#include <bits/stdc++.h> #include <iostream> using namespace std;#include<stdio.h> #include<string.h> int main() {char ss[10] = "12345";cout<<"org ss is :"<< &ss << endl;gets(ss);cout<<"now ss is :"<< &ss << endl;for (int i = 0; i < 10;++i){cout << ss[i] ;}cout << endl;//strcat(ss,"6789");//printf("%s\n",ss);return 0; }

輸入abc,輸出結果如圖

在本來該存放“12345”的內存區域,變成了“abc 5”

看到這里,也許有朋友會問,不應該是"abc45"嗎,為什么莫名多了一個空格?

當年學C的時候,學校老師就叮囑我們一定要注意C-type字符串的結束符 ‘\0’
‘\0’標志著一個字符串的結束,
讓我們輸出一下’\0’的ASCII碼驗證一下

末尾加一行代碼:

printf("%d", ss[3]);

自信輸出ACII碼為0,\0為占位符無疑

在這里,我們再來驗證一下,字符數超過char ss[10]的情況

#include <bits/stdc++.h> #include <iostream> using namespace std;#include<stdio.h> #include<string.h> int main() {char ss[10] = "123456789";cout<<"org ss is :"<< &ss << endl;gets(ss);cout<<"now ss is :"<< &ss << endl;for (int i = 0; i < 10;++i){cout << ss[i] ;}cout << endl;//strcat(ss,"6789");//printf("%s\n",ss);printf("%d", ss[3]);return 0;}

需要注意的是,由于需要一個結束符占位,所以ss[10]只能存到1-9

起始地址不變,原數組被覆蓋。

三、總結一下

C-type的字符串ss,其實只是一個首地址,
我們用gets()輸入數據,其實就是從字符串不斷疊加,通過換行符終止之后,gets就自動加個’\0’標志字符串結束。
輸出的時候,系統也是不斷的順著首地址讀,讀到結束符為止。

所以:

  • 覆蓋了原數據;
  • 不受原數組大小限制;
  • 不會指向一個新地址;
  • 其實gets與scanf相比還有一些不同的特性,這里暫且不表,
    表達能力有限,
    祝大家端午安康,天天開心吧~!


    感覺有用請點個贊哦~

    總結

    以上是生活随笔為你收集整理的由入门C语言题目浅析gets()函数的用法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。