字串輸入時的strlen 與 0

2022-01-15 12:18:45 字數 2073 閱讀 5665

在做串的資料結構時,被字串printf %s輸出時的結尾判斷、strlen();長度、自定義strcopy();字串複製函式、strassign();字串賦值函式卡了一下,固寫此博鞏固相關知識點。

正文如下:

串的結構

這裡操作實現的串t是乙個0位儲存長度、其餘位置用於儲存字元的串。

相關模組**

首先,給出字串賦值函式的**,便於之後的理解。   

#define ok 1

#define maxstrlen 40typedef

intstatus;

typedef

char

sstring[maxstrlen];

status strassign(sstring t,

char *chars)

t[0] = maxstrlen; //

t[0]存入int 型資料,%s無法列印

}

else

}return

ok;}

**易錯點分析尤其要注意 strlen() 函式,它在計算長度時沒有將' \0 '計算在內,不然就沒有空串(長度為零的串)這一說,下面舉乙個例子去論證·:

#include #include #include #include int main( void )

/****************

output:

'how long am i?' is 14 characters long

*******************/

然後我們運用這個結論再去看串賦值函式,就能明白由於迴圈結束條件是i <= strlen(chars),chars中的' \0 『 是不會賦值給t的,所以當你用printf %s  輸出時,陣列的儲存內容中找不到' \0 ',所以就會一直讀下去,直到某個內容是』 \0 『 為止。

以下是我的**論證:

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 1

typedef 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...