在做串的資料結構時,被字串printf %s輸出時的結尾判斷、strlen();長度、自定義strcopy();字串複製函式、strassign();字串賦值函式卡了一下,固寫此博鞏固相關知識點。
正文如下:
串的結構
這裡操作實現的串t是乙個0位儲存長度、其餘位置用於儲存字元的串。
相關模組**
首先,給出字串賦值函式的**,便於之後的理解。
#define ok 1**易錯點分析尤其要注意 strlen() 函式,它在計算長度時沒有將' \0 '計算在內,不然就沒有空串(長度為零的串)這一說,下面舉乙個例子去論證·:#define maxstrlen 40typedef
intstatus;
typedef
char
sstring[maxstrlen];
status strassign(sstring t,
char *chars)
t[0] = maxstrlen; //
t[0]存入int 型資料,%s無法列印
}
else
}return
ok;}
#include #include #include #include int main( void )然後我們運用這個結論再去看串賦值函式,就能明白由於迴圈結束條件是i <= strlen(chars),chars中的' \0 『 是不會賦值給t的,所以當你用printf %s 輸出時,陣列的儲存內容中找不到' \0 ',所以就會一直讀下去,直到某個內容是』 \0 『 為止。/****************
output:
'how long am i?' is 14 characters long
*******************/
以下是我的**論證:
1. 通過gets(); 或者 scanf(); 由於gets();的特性是將輸入的' \n ' 轉化為 ' \0 ' 然後賦值給字串,scanf();的特性是串中讀到空白字元(' \n ',' ',與' \t ') 的時候將空白字元轉化為\0賦值給字串,並在快取區中載入' \n ',因此當用gets();或者scanf();輸入'abc'後,str中的char陣列都將被賦值為 ' a ' ,' b ',』 c 『,』 \0 『 。
2. 通過strassign();函式 將str的串值賦值給s1,由於迴圈結束條件是i <= strlen(chars),所以』 \0 『不會被賦值到s1當中去。
3.printf(%s, ); 找不到串尾標識『 \0 ',不斷向下查詢知道下乙個' \0 '的出現,所以導致亂碼
**修改
想到達到printf(%s,);能夠正常輸出的結果,則需要在串賦值時加上\0,修改情況以及程式執**況如下:
或者對於串首存長度這種特性的字串單獨寫乙個print函式,將s1[1]到s1[max]給列印出來。
修改情況以及執**況如下:
#define ok 1typedef int status;
/* 列印字串 */
學會並運用資料結構,的確不易,應潛下心來好好鑽研,忌一蹴而就。
Linux鍵盤輸入時如何隱藏輸入的字串
今天遇到乙個小需求,執行某個應用程式時,需要驗證密碼,不能顯示輸入的內容,即不回顯。有人推薦使用 getpass 函式,通過man查閱發現該介面提示被淘汰,建議使用 termios。於是經過多方調研,決定使用getch 函式,並配合 termios使用,關鍵 如下 set disp mode 介面用...
字串的輸入與輸入
一 使用陣列的方法 缺點 不能接受含有空格的字串 char s 1000 scanf s s printf s s 先定義字元變數s 用char s表示 然後在定義變數s後面加上,裡面寫上資料大小。一般沒告訴資料範圍,資料一般開1000就行。例如,資料是100,我們開110就行。然後用輸入和輸出函式...
字串長度strlen
繼續回憶關於庫函式的部分實現,下面是strlen函式的實現,裡面也有乙個小問題,不知道有沒有意義 include intmystrlen const char psrc while psrc 0 printf nval d n nval return nval int main int argc,c...