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

時間 2021-12-25 10:23:56

1樓:

哎。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]=,它也是一個不確定值。

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

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

2樓:

這。。。

我的結果是15 3

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

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

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

3樓:

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

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

4樓:匿名使用者

我在 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" ;

結果就是你想要的.

5樓:思人思國

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

//#include "stdafx.h"

#include "iostream"

#include "fstream"

using namespace std;

int _tmain(int argc, _tchar* ar**),q[10]=;

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

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

//getchar();

getchar();

return 0;

}按照你說的我也測試過了,我用vs2008平臺輸出的是12 3.。

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

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

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

6樓:匿名使用者

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

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

你可以這樣

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

在我的上面(tc)是

3 3 3 9

7樓:

哎。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]=,它也是一個不確定值。

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

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

8樓:匿名使用者

這。。。

我的結果是15 3

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

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

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

9樓:匿名使用者

前兩個明顯是3、3

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

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

10樓:思人思國

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

//#include "stdafx.h"

#include "iostream"

#include "fstream"

using namespace std;

int _tmain(int argc, _tchar* ar**)

,q[10]=;

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

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

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

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

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

11樓:匿名使用者

我在 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" ;

結果就是你想要的.

12樓:匿名使用者

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

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

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

13樓:匿名使用者

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

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

14樓:匿名使用者

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

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

15樓:

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

C語言字串問題,C語言字元陣列與字串問題

字串初始化,如果逐個賦值的話,系統不是會自動新增 0 嗎不是。圖一就是長度為4的陣列,圖二長度為5圖三會是新增 0,但是是會把後面所有的都設為 0因為圖一和圖四不以 0結尾,所以不能用strlen和strcmp,會越界 圖四也可以用char str 4 stop 這樣賦值。如果不手動加長度就會是5了...

C語言字元陣列與字串問題,C語言中將字串賦值給字元陣列的問題

渿河 這是在定義時初始化 如果你的右邊花括號內的字元個數少於 陣列元素個數 那麼其餘的陣列元素將會初始化為0 0 的ascii碼的值就是0 如果你不指定陣列元素個數 編譯器會自動幫你計算出元素個數的 char c 10 這個是已經給定了陣列的大小,達不到陣列大小的長度的話會自動添零的 c語言中將字串...

c語言strlen判斷字元長度的問題

小八 不是6應該是5吧 因為你輸入的長度是4再加 0 所以是5 include include main 試試這樣的,你要是一個字元一個字元的輸入,if a i n 就沒意義了。 你定義的字元陣列char 4 他的長度就是5 上你的scanf 輸入後有個 0就6了 scanf s a 這樣 c語言中...