1樓:匿名使用者
r=;這是個字元陣列,系統只為它分配了3個位元組的空間,但是strlen只有遇到'\0'才會返回
,於是它會向後繼續進行,直到有'\0',這其實是越界(或許沒有,可能訪問的是q[10])了.
你可以這樣
printf("%s\n", r);來檢視下列印的資訊。
在我的上面(tc)是
3 3 3 9
2樓:
哎。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]=,它也是乙個不確定值。
明白了沒,不懂繼續追問。
寫這麼多,真的好累。。。
3樓:匿名使用者
這。。。
我的結果是15 3
因為字串p沒有結尾符\0
因此結果不定,和原來的儲存的資料有關
如圖,是除錯結果,可以看到,p後面是亂碼
4樓:匿名使用者
前兩個明顯是3、3
因為 strlen 求的是字串長度,遇到 '\0',就結束,字串 "abc" 的長度就是3
後兩個都沒有賦值 '\0' ,因此不確定長度,可以是比3大的任何數
5樓:思人思國
// 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。
6樓:匿名使用者
我在 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" ;
結果就是你想要的.
7樓:匿名使用者
p[10]是有10個字元的陣列,
"abc"就是乙個字串,長度為三個字元。所以strlen(p)=3s是不固定長度的陣列,「abc」這個字串雖然只是陣列的乙個長度,但佔據三個字元的空間
是陣列的三個值,陣列長度為3,但總字元數是3q[10]固定陣列長度所以三個值儲存時每個字元佔據乙個位r不固定長度所以每個值佔據兩個位,最後還要關閉乙個位,所以就是7
8樓:匿名使用者
strlen用來計算字串的,直到碰到第乙個字串結束符'\0'為止,在你的陣列p中,你沒有給定陣列長度,由於有3個字元,所以實際長度為3,但是由於沒有'\0'結束,所以根據strlen的工作原理,你還是得不出它的實際長度,所以出現了未定義的結果。你可以用sizeof操作符。而q陣列的長度為10,但是只存入了3個值,其它的元素都是\0,因此用strlen可以計算出它的實際長度。
如果你將p找長度設為4,你會發現可以得出正確的結果!
9樓:匿名使用者
不對吧,最後乙個會報錯的,strlen(r),r根本沒有『\0'結束符
c語言中,關於字串長度與字元陣列長度的問題。 20
10樓:
c語言約定字串以 '\0' 結尾,上述陣列末尾沒有 '\0' ,所以字串的長度無法確定。
11樓:看灰過來了
陣列長度指的是陣列的元素個數,字串長度是以『\0』為標誌來確定的,舉個例子:
char a[20]="abc";
陣列長度是20,而字串長度是3,隱含的'\0'不算在字串長度中。
12樓:匿名使用者
char a=;按陣列來說已經初始化了3個char型別,分配了3個char大小空間,而如果作為字串,記憶體空間給字元指標a只指定了三個連續的char大小的空間,然後a[2]後面的記憶體塊空間儲存的到底是什麼內容就是隨機的了,而字串以 '\0' 結尾,後面具體哪個是 '\0'完全不確定 ,所以字串的長度無法確定
13樓:zr稻草人
c語言中沒有字串型別,c風格字串用字元陣列來表示,並以『\0』結束,與字串操作相關的函式都要求被操作的字串滿足這一條件,你給出的字元陣列沒有最後的空字元,也就是說編譯器沒有乙個標誌可以讓它結束對這個字串的長度的求解,所以不確定,陣列長度為3是因為只有3個元素,如果你這樣初始化:char a = "abc",編譯器會自動給你加乙個空字元,這樣字串長度就能確定為3了(確定字串長度時編譯器忽略最後的空字元)
14樓:求知一人
1樓正解,你在初始化時給陣列a賦了3個值,所以其實a的型別應該是 char a[3],陣列長度為3,。
而字串就不一樣了,他必須以『\0』結尾,你的 『a』 『b』 『c』儲存在乙個連續的位址上,字串的長度是從『a』的位址開始一直計數,當讀到『\0』時結束,雖然你沒有用到『c』後面的位址,但它會一直讀下去並計數,如果『c』後面的位址存的是『\0』那長度就是3了,如果不是就一直往下讀,所以說字串的長度不確定
15樓:取名想萬年
字串叫string吧?
16樓:匿名使用者
改正"看灰過來了":
char a[20]="abc";其中字串的長度為4,如果用strlen計算字串的長度,則是3,因為不加\0,如果用sizeof,就是4
c語言中,關於字串長度與字元陣列長度的問題
c語言約定字串以 0 結尾,上述陣列末尾沒有 0 所以字串的長度無法確定。陣列長度指的是陣列的元素個數,字串長度是以 0 為標誌來確定的,舉個例子 char a 20 abc 陣列長度是20,而字串長度是3,隱含的 0 不算在字串長度中。char a 按陣列來說已經初始化了3個char型別,分配了3...
c語言中陣列長度問題
首先你要明白 乙個整形資料或者字元型資料佔多少個位元組 跟你的系統和編譯器都有關 vc 6.0 乙個int形占用四個位元組 乙個char形占用1個位元組然後你的兩個陣列都包含7個元素 然而第二個陣列的賦值很詭異 字元陣列接收一些非字元資料 還真沒試過怎麼樣 字元陣列看見乙個 0就結束了 你的兩個陣列...
c語言中字元陣列和字元指標的問題
在函式內 char陣列被定義成局 部變數,函式執行後會被系統給釋放掉。但char p 則是定義成乙個常量,程式執行完後才會釋放掉。所以在返回char p 時會返回亂碼,但 char p 則可以全部顯示出來 當然 char 也可以定義成靜態變數 這樣就可以顯示出來了不如static char p he...