c語言中strlen怎麼用,c語言strlen函式問題

2021-04-17 15:24:34 字數 6035 閱讀 8749

1樓:風若遠去何人留

strlen為c語言庫函式,包含於string.h中,作用為計算乙個字串(字元陣列)中元素的個數,即從陣列頭部計數,直到遇到字串結束符\0為止,計數結果不包括\0.

其宣告為:

unsigned int strlen(char *s);

比如定義字串:

char *p = "this is for testing";

呼叫strlen(p);

返回的結果就是p中元素的個數,即19。

需要注意的是,strlen並不是絕對安全的,如果在傳入的字元陣列的合法範圍內,不存在結束符\0,那麼strlen函式會一直訪問下去,超出陣列範圍,即出現越界訪問。

所以使用strlen時,程式設計師必須確認引數字元陣列中包含\0值,否則會出現不可預知後果。

2樓:匿名使用者

sizeof與strlen的區別

1.sizeof操作符的結果型別是size_t,它在標頭檔案中typedef為unsigned int型別。

該型別保證能容納實現所建立的最大物件的位元組大小。

2.sizeof是算符,strlen是函式。

3.sizeof可以用型別做引數,strlen只能用char*做引數,且必須是以''\0''結尾的。

sizeof還可以用函式做引數,比如:

short f();

printf("%d\n", sizeof(f()));

輸出的結果是sizeof(short),即2。

4.陣列做sizeof的引數不退化,傳遞給strlen就退化為指標了。

5.大部分編譯程式 在編譯的時候就把sizeof計算過了 是型別或是變數的長度這就是sizeof(x)可以用來定義陣列維數的原因

char str[20]="0123456789";

int a=strlen(str); //a=10;

int b=sizeof(str); //而b=20;

6.strlen的結果要在執行的時候才能計算出來,時用來計算字串的長度,不是型別佔記憶體的大小。

7.sizeof後如果是型別必須加括弧,如果是變數名可以不加括弧。這是因為sizeof是個操作符不是個函式。

8.當適用了於乙個結構型別時或變數, sizeof 返回實際的大小,

當適用一靜態地空間陣列, sizeof 歸還全部陣列的尺寸。

sizeof 操作符不能返回動態地被分派了的陣列或外部的陣列的尺寸

9.陣列作為引數傳給函式時傳的是指標而不是陣列,傳遞的是陣列的首位址,

如:fun(char [8])

fun(char )

都等價於 fun(char *)

在c++裡引數傳遞陣列永遠都是傳遞指向陣列首元素的指標,編譯器不知道陣列的大小

如果想在函式內知道陣列的大小, 需要這樣做:

進入函式後用memcpy拷貝出來,長度由另乙個形參傳進去

fun(unsiged char *p1, int len)

我們能常在用到 sizeof 和 strlen 的時候,通常是計算字串陣列的長度

看了上面的詳細解釋,發現兩者的使用還是有區別的,從這個例子可以看得很清楚:

char str[20]="0123456789";

int a=strlen(str); //a=10; >>>> strlen 計算字串的長度,以結束符 0x00 為字串結束。

int b=sizeof(str); //而b=20; >>>> sizeof 計算的則是分配的陣列 str[20] 所佔的記憶體空間的大小,不受裡面儲存的內容改變。

上面是對靜態陣列處理的結果,如果是對指標,結果就不一樣了

char* ss = "0123456789";

sizeof(ss) 結果 4 ===》ss是指向字串常量的字元指標,sizeof 獲得的是乙個指標的之所佔的空間,應該是

長整型的,所以是4

sizeof(*ss) 結果 1 ===》*ss是第乙個字元 其實就是獲得了字串的第一位'0' 所佔的記憶體空間,是char類

型的,佔了 1 位

strlen(ss)= 10 >>>> 如果要獲得這個字串的長度,則一定要使用 strlen

3樓:個人資訊保密

strlen所作的僅僅是乙個計數器的工作,它從記憶體的某個位置(可以是字串開頭,中間某個位置,甚至是某個不確定的記憶體區域)開始掃瞄,直到碰到第乙個字串結束符'\0'為止,然後返回計數器值。

原型:extern unsigned int strlen(char *s);,在visual c++ 6.0中,原型為size_t strlen( const char *string );,其中size_t實際上是unsigned int,在vc6.

0中可以看到這樣的**:typedef unsigned int size_t;。

標頭檔案:string.h

格式:strlen (字元陣列名)

功能:計算字串s的(unsigned int型)長度,不包括'\0'在內

說明:返回s的長度,不包括結束符null。

因為字串是以字元'\0'結尾的,但是這個'\0'在我們的字串是隱藏的,我們看不到。實際上是有的.例如:

char a[4]="abc";//這裡陣列的元素個數至少應該是4,否則此字串不叫字串了,只能叫字元陣列了。

strlen判斷乙個字串的結束就是以其末尾的'\0'為界限。其實現**可以模擬為以下:

int strlen(char *p)

所以他是不包括'\0'這個字元的。

4樓:天雲一號

strlen()函式的作用是統計給定字串的長度。

函式原型:unsigned int strlen(char *str);

功       能:統計字串str中字元的個數,不包括'\0'

返  回  值:返回字元個數

舉例:char *str1 = "abcdef";   // 定義乙個字元指標

char str2 = "abcdef";  // 定義乙個字元陣列

int len = strlen(str1);  // 統計str1字元的個數,結果為6

int len = strlen(str2);  // 統計str2字元的個數,結果為6

5樓:匿名使用者

這個問題問的好。strlen是以\0作為標誌結束的。s\n\016\0。-.-\016...\016是乙個轉義後的字元 016是8進製數

6樓:冰_vs_霰

strlen是測量字串長度的

char d=和char a="china"; char b=; 是等價的 是陣列的表示形式

而char c=;卻是字元陣列所以並不能得到結果

7樓:匿名使用者

strlen函式測量字串中字元個數,不包括結尾的'\0'字元,你的 char c沒有結尾的『\0』不是合法的字串,所以結果不對

8樓:滕秋昀

簡單的跟你說strlen是算長度的,比如,你定義int a[10];

如果運算sizeof(a),會返回40.因為乙個int型別佔了4個位元組的記憶體空間,10個就佔了40位元組

如果運算strlen(a),返回不一定是40,這要看你在a陣列裡面用了多少空間,如果用了4個位元組,就返回4,如果用滿就是返回40了

9樓:

__cdecl strlen(const char *);

計算字串的實際長度(不含字串結束標誌『\0』),並將計算結果作為函式值返回。

10樓:匿名使用者

strlen是字串長度統計函式,他不包含字串結束符「\0」;

求字元陣列長度可以用 sizeof()如你上面的問題可以用:

sizeof(c)/sizeof(c[0])

11樓:文霞yi莉

他是乙個統計字串長度的函式,給你舉個例子:希望能幫到您!

#include

#include

void f(char a);

int main()

void f(char a)

printf("\n");}

12樓:手機使用者

尾的'\0'。

strlen的工作原理是不斷向後看,直到乙個'\0'字元。

因此第乙個程式的執行結果是不可**的,取決於之前記憶體裡的殘留資料。

而第二個程式,陣列的剩餘項均被賦成0

13樓:匿名使用者

如下,已通過編譯驗證:

#include

#include

char a[50];

int i,l;

int main()

}l=strlen(a);

printf("\n");

for(i=l-1;i>=0;i--)

printf("%c",a[i]);

return 0;}

14樓:匿名使用者

strlen()只是統計字串的長度,統計到'\0'結束,但不包括'\0',這個與sizeof()不一樣。

對於用雙引號引起來的字串,系統預設最後一位字元為'\0',如你自己定義的:

char a="china";

char b=;

另外,陣列初始化還可以是乙個字元乙個字元賦值,如:

char c=;

char d=;

但系統不會自動給你在最末位新增'\0』

所以在統計char c=時,統計到a時,系統還沒找到\0,所以會繼續統計,直到找到'\0'為止。所以就有你第三個值為11的情況,這個根據不同的執行環境而定。

15樓:匿名使用者

strlen是求字串長度的函式。

函式原型:unsigned int strlen(char *s);

引數:s是char型別的指標,指向要求長度的字串返回值:返回字串的長度,返回型別是無符號整型注意:

strlen所作的僅僅是乙個計數器的工作,它從記憶體的某個位置(可以是字串開頭,中間某個位置,甚至是某個不確定的記憶體區域)開始掃瞄,直到碰到第乙個字串結束符'\0'為止,然後返回計數器值(長度不包含「\0」)。

例項:#include

#include

int main(void)

16樓:

char str[100]="this is test";

int len;

len = strlen(str);

c語言strlen函式問題

17樓:勿忘心安

strlen實際上是,從引數表示的位址往後找,找到第乙個'\0',即串尾。然後計算'\0'至首位址的「距離」,即隔了幾個字元,從而得出長度。

char x=;中,實際上是定義了乙個char型的陣列,而由於x[0],即0xbc開始往後找,一直到0xca,都沒'\0',所以會繼續往後。當然,實際上往後找到的是其他值。

改char x=;後,應該就是3了。

擴充套件資料:

strlen所作的僅僅是乙個計數器的工作,它從記憶體的某個位置(可以是字串開頭,中間某個位置,甚至是某個不確定的記憶體區域)開始掃瞄,直到碰到第乙個字串結束符'\0'為止,然後返回計數器值(長度不包含'\0')。

函式原型

extern unsigned int strlen(char *s);

在visual c++ 6.0或dev-c++中,原型為

size_t strlen(const char *string);

,其中size_t實際上是unsigned int,在vc6.0或dev-c++中可以看到這樣的**:

typedef unsigned int size_t;

標頭檔案:string.h或cstring

格式:strlen (字元陣列名)

功能:計算給定字串的(unsigned int型)長度,不包括'\0'在內

說明:返回s的長度,不包括結束符null。

c語言 define 怎麼用的,C語言中 define是什麼意思

有三種用法,例如替代多行的 條件編譯,還有典型的巨集定義,具體如下 1 define最重要的用法是條件編譯 ifdef windows endif ifdef linux endif 可以在編譯的時候通過 define設定編譯環境2 典型的使用方法 使用巨集定義我們可以自己根據自己的習慣來定義甚至改...

c語言中for語句是怎麼用的c語言中兩個for語句的是怎樣迴圈的

c語言中for語句用法 for是c語言中的乙個關鍵字,主要用來控制迴圈語句的執行。舉例 int i for i 0 i 3 i i 0是初始化部分 i 3是迴圈判斷條件部分 當滿足此條件時才進入執行for迴圈中的語句 i 是執行完迴圈體語句後的操作 上面的for語句就是控制輸出3次helloworl...

c語言中1101怎麼理解,c語言中110為什麼會是1啊,還有210為什麼是2。。請回答者說的簡單易懂點。

在c語言中是乙個取餘數的符號 在本題中1 10就是1 10後取餘數,而1不夠除以10,所以取商等於0,根據餘數 被除數 除數 商 1 10 0 1,即得餘數為一 所以輸出1 1除以10不夠除,又把1還回來了 同理,2除以10,也不夠除,所以餘數還是原來的2 1 10 0.1 請複習數學知識 是求餘 ...