c語言中,關於字串長度與字元陣列長度的問題

2021-04-30 14:52:01 字數 5422 閱讀 3491

1樓:

c語言約定字串以 '\0' 結尾,上述陣列末尾沒有 '\0' ,所以字串的長度無法確定。

2樓:看灰過來了

陣列長度指的是陣列的元素個數,字串長度是以『\0』為標誌來確定的,舉個例子:

char a[20]="abc";

陣列長度是20,而字串長度是3,隱含的'\0'不算在字串長度中。

3樓:匿名使用者

char a=;按陣列來說已經初始化了3個char型別,分配了3個char大小空間,而如果作為字串,記憶體空間給字元指標a只指定了三個連續的char大小的空間,然後a[2]後面的記憶體塊空間儲存的到底是什麼內容就是隨機的了,而字串以 '\0' 結尾,後面具體哪個是 '\0'完全不確定 ,所以字串的長度無法確定

4樓:zr稻草人

c語言中沒有字串型別,c風格字串用字元陣列來表示,並以『\0』結束,與字串操作相關的函式都要求被操作的字串滿足這一條件,你給出的字元陣列沒有最後的空字元,也就是說編譯器沒有乙個標誌可以讓它結束對這個字串的長度的求解,所以不確定,陣列長度為3是因為只有3個元素,如果你這樣初始化:char a = "abc",編譯器會自動給你加乙個空字元,這樣字串長度就能確定為3了(確定字串長度時編譯器忽略最後的空字元)

5樓:求知一人

1樓正解,你在初始化時給陣列a賦了3個值,所以其實a的型別應該是 char a[3],陣列長度為3,。

而字串就不一樣了,他必須以『\0』結尾,你的 『a』 『b』 『c』儲存在乙個連續的位址上,字串的長度是從『a』的位址開始一直計數,當讀到『\0』時結束,雖然你沒有用到『c』後面的位址,但它會一直讀下去並計數,如果『c』後面的位址存的是『\0』那長度就是3了,如果不是就一直往下讀,所以說字串的長度不確定

6樓:取名想萬年

字串叫string吧?

7樓:匿名使用者

改正"看灰過來了":

char a[20]="abc";其中字串的長度為4,如果用strlen計算字串的長度,則是3,因為不加\0,如果用sizeof,就是4

c語言中關於字元陣列的長度問題

8樓:匿名使用者

r=;這是個字元陣列,系統只為它分配了3個位元組的空間,但是strlen只有遇到'\0'才會返回

,於是它會向後繼續進行,直到有'\0',這其實是越界(或許沒有,可能訪問的是q[10])了.

你可以這樣

printf("%s\n", r);來檢視下列印的資訊。

在我的上面(tc)是

3 3 3 9

9樓:

哎。strlen()是在string.h裡面的,getch()是在conio.h裡面的,

不過,我用的是cfree,至於其它的編譯器,我就不知道了。

至於你的問題,當你仔細看看他們的結果,你就會有結論了。

很明顯,strlen(q)的值是一樣的,不同的是p的字元長度

而它們的區別,就在於,它們乙個有陣列的長度,另乙個沒有。

陣列q,它的長度是10,所以一開始就會分配10個大小為sizeof(char)的空間,然後,就把a,b,c分別放進從分配的第乙個,第二個,第三個空間裡面,然後,剩下的變為0()也就是'\0'。

所以用strlen(q)的時候,就是3

而沒有長度的p,它預設了長度,所以系統就會按你給的元素個數分配,這裡p有3個元素,所以就分配3個大小為sizeof(char)的空間,當你用strlen(p)的時候,因為strlen()是以字串終結符'\0'來判定字串長度的,所以呢,strlen(p)是乙個不確定值。

如果你還沒能理解為什麼是乙個不確定值,那就繼續看下去。

在c中,是不會檢測是否越界的,你可以順著陣列一直訪問下去,比如你定義乙個 int a[10]

你可以訪問a[12],a[13](當然也可以訪問a[-1],a[-100]),只是這些值是不確定的。它訪問的方式,是從陣列的起始位址開始,按照陣列下標值,進行相對位移(它們所跳過的長度是陣列型別的長度,比如上面,是跳過sizeof(int)的長度)。

而strlen()就是從它首位址開始,乙個個開始檢測,是否達到'\0『,然後返回長度值。

當你呼叫strlen()的時候,如果沒有終止符'\0』,它就會越界檢查,直到找到'\0『。

就像 char a[3]=,它也是乙個不確定值。

明白了沒,不懂繼續追問。

寫這麼多,真的好累。。。

10樓:匿名使用者

這。。。

我的結果是15 3

因為字串p沒有結尾符\0

因此結果不定,和原來的儲存的資料有關

如圖,是除錯結果,可以看到,p後面是亂碼

11樓:匿名使用者

前兩個明顯是3、3

因為 strlen 求的是字串長度,遇到 '\0',就結束,字串 "abc" 的長度就是3

後兩個都沒有賦值 '\0' ,因此不確定長度,可以是比3大的任何數

12樓:思人思國

// baidu.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include "iostream"

#include "fstream"

using namespace std;

int _tmain(int argc, _tchar* argv)

,q[10]=;

printf("%d %d\n",strlen(p),strlen(q));

//while(p[i]!='\0')

//{// cout<照你說的我也測試過了,我用vs2008平台輸出的是12 3.。

首先可以看一下strlen()這個function,他是測試字串的實際長度,現在我們是用字元陣列當作字串用,也就是把字元陣列的首指標當做字串的首指標,但是在不同平台中字串的長度在一定的範圍內是給定的,因為對於處理變長的字串還是比較難的。所以測試的時候出現了這樣的情況。你按照這個理解就好。

我另外測試了,像這種的情況,一般在vs2008中是實際長度+9,所以我測出來的是12。

13樓:匿名使用者

我在 linux下列印為 6, 3;

在因為在 p 的最後沒有加上 '\0', 所以 strlen(p)時會把 q中的字元也算上.

你試著把 q中的 a,b,c 改為 d,e,f , 然後再 printf(p), 此時列印就為 abcdef.

把 char p=, q[10]=; 即可.

或者不要那麼費力,直接寫為

char p = "abc" ; // 它會在後面加 '\0'; 此時sizeof(p) 為 4 ;

char q[10] ="def" ;

結果就是你想要的.

14樓:匿名使用者

p[10]是有10個字元的陣列,

"abc"就是乙個字串,長度為三個字元。所以strlen(p)=3s是不固定長度的陣列,「abc」這個字串雖然只是陣列的乙個長度,但佔據三個字元的空間

是陣列的三個值,陣列長度為3,但總字元數是3q[10]固定陣列長度所以三個值儲存時每個字元佔據乙個位r不固定長度所以每個值佔據兩個位,最後還要關閉乙個位,所以就是7

15樓:匿名使用者

strlen用來計算字串的,直到碰到第乙個字串結束符'\0'為止,在你的陣列p中,你沒有給定陣列長度,由於有3個字元,所以實際長度為3,但是由於沒有'\0'結束,所以根據strlen的工作原理,你還是得不出它的實際長度,所以出現了未定義的結果。你可以用sizeof操作符。而q陣列的長度為10,但是只存入了3個值,其它的元素都是\0,因此用strlen可以計算出它的實際長度。

如果你將p找長度設為4,你會發現可以得出正確的結果!

16樓:匿名使用者

不對吧,最後乙個會報錯的,strlen(r),r根本沒有『\0'結束符

c語言中將字串賦值給字元陣列的問題

17樓:大野瘦子

char s[20];s="helo";這樣錯誤的原因就是:不能用賦值語句將乙個字串常量直接給乙個字元陣列賦值。

char s[20];

char ss="hello";

s=ss;錯誤原因是:不能用賦值語句將乙個字元陣列直接給乙個字元陣列賦值

,即字串的複製(c語言中,但是在c++的string 類,上面的賦值是正確的)必須用strcpy()函式實現。

而char a[ ]=」toyou「;正確的原因是:因為在宣告陣列變數的時候就是,為其開闢空間,並為其初始化,這樣才是符合c語言語法的。

c語言中字串賦值的理解

一、指標式賦值

上面的示例是顯然可以正常執行的,也是很容易理解的。但是下面這種方式就令人有點難以理解了。

通過程式的運**況,我們可以知道:char *p = "hello";這種字串的賦值方式是完全沒有問題的。要理解這種賦值方式,我們首先得理解雙引號(特別注意:

這個是雙引號,不要賦值的時候給弄了個單引號)在這個語句中做了什麼工作。雙引號主要做了3個工作,分別是:

(1)申請了空間(在常量區),存放了字串。

(2)在字串尾加上了「\0」。

(3)返回位址。

這裡所返回的位址就賦值給了char *型別的指標變數p。

二、通過字元陣列直接把字串賦值。程式如下:

三、需要注意的一些問題

直接把字串賦值給陣列名(也就是陣列首元素的首位址)是不行的。

18樓:

char a ="toyou";

這才是對的,要用雙引號。

這種方式叫初始化,是可以的,"toyou"這個字串放在資料區里,在編譯階段就確定了。

a作為陣列名,它是乙個常指標,不能改變所指向的位址,只能是&a[0]所以你在非宣告的地方用a="***",就相當於改變了常量的值,是不允許的。

19樓:

#include

int main()

20樓:豬頭或火寶寶

你好!!!

舉例如下:

char s[20];s="helo";這樣是錯誤的,原因就是不能用賦值語句將乙個字串常量直接給乙個字元陣列賦值。

char s[20];

char ss="hello";

s=ss;這也是錯誤的,原因是不能用賦值語句將乙個字元陣列直接給乙個字元陣列賦值

即字串的複製(c語言中,但是在c++的string 類,上面的賦值是正確的)必須用strcpy()函式實現。

而char a[ ]=」toyou「;為上面是正確呢???那是因為我們在宣告陣列變數的時候就是,為其開闢空間,並為其初始化,這樣才是符合c語言語法的。而上面的都是不符合語法的。

C 字串長度與位元組的問題,C 字串有效長度的問題

1 strlen函式是返回字元長度 以空字元為結束符 所以是5 2 sizeof str 返回是指定變數占用空間大小str是指標變數,指標大小為4,所以返回4你可以把str變成陣列 char str 12345 此時str是陣列,所以sizeof str 返回的是6 strlen 函式返回不包含結束...

c語言中字串相減是什麼意思,C語言中字串相減是什麼意思

從首字母開始,比較字元的大小,如果一個a可通用,一個b開頭,那麼a開頭的 就大,則相減結構為正 字串不能相減,但你可以用strcmp來做比較,其實該函式也是從字串的首地址開始比較字元的ascii碼 金色潛鳥 1 c語言中沒有 字串相減 運算。2 c語言中 有 單個字元 相減 運算。例如,把字串 12...

c語言輸入長度不超過字元的字串將其

第一種 include include int main int i,j 0,len strlen str1 for i len 1 i 0 i for i 0 i 第二種 include include int main printf s n str return 0 第一種 include vo...