由入门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++,所以需要加點頭文件
輸入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()函数的用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言题目——三子棋游戏
- 下一篇: 如何搭建一个好的测试环境