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語言中...