1樓:匿名使用者
sizeof()是單目運算子,功能是返回括號內那貨佔用的位元組數。
括號內是char s,陣列,佔用位元組數取決於初始化時賦值的內容。
初始化賦值的內容是"\123\\100a\t"
下面要說的,你最好比對著課本來看。
關於字元,有兩種表示形式,普通形式(例如'a'),還有轉義字元形式。
轉義字元是由前導和字尾組成。
前導是\,表示後續跟進內容意義反轉,不做常規解釋;字尾就是後續跟進的內容。
轉義字元的字尾,允許由特殊字母和普通數值(只允許八進位制和十六進位制)組成。
'\n'是最常見的由特殊字元組成的轉義字元。
由於字元表示中,單引號、雙引號、反斜槓意義特殊,要正常表示這三種字元,必須再次新增反斜槓字首,也就是對應'\'','\"','\\'
而數值跟進的,\之後直接跟著數值,說明是八進位制資料,最長允許3位合法的八進位制資料(例如'\35');若是\之後緊跟x,就表示是十六進位制,最長允許2位合法十六進位制資料。
舉例:"12\789\x123\09654"
開頭1和2是2個普通字元;
之後\緊跟陣列,允許至多三個合法八進位制,八進位制範圍0-7,所以只能取\7,這是第3個字元;
89是第4、5個字元;
\x十六進位制,至多2個合法十六進位制,所以取\x12,這是第6個
3是第7個;
再往後,不用細說了,第8個是\0。
由於\0是字串結束標誌,所以字串就此截止,後續內容不予考慮。
你這道題目,我用空格給你間隔一下就行了
\123 \\ 1 0 0 a \t 這是字串的組成內容,一共7個。
但是,上面說了,字串的結束標誌是\0,不管寫沒寫,\0一定存在。
所以,題目中給定的字串s,由8個字元組成,答案是8
至於你問的strlen函式,求字串長度的。字串長度不計算空字元,但空字元佔用記憶體空間,可以機械性的記憶成長度=位元組數-1
2樓:斌——霜
sizeof只計算型別的大小,比如char是一個字元,int是四個字元(32位)等等,不過指標永遠都是四個字元。那個strlen只計算字串的大小。對於sizeof和strlen的區別是strlen不會算最後一個"\0",而sizeof會算的。
不知道這樣解答你明白了麼
3樓:匿名使用者
sizeof是指變數佔的記憶體的大小,strlen是指字串的長度char a[10]="1234";
sizeof(a)=10;
strlen(a)=4;
在c語言求字元長度的問題,strlen與sizeof怎麼計算出來的長度不是我們理解的那樣?
4樓:匿名使用者
sizeof(p)計算的是p變數的
bai大小du
zhi由於p是指標,p的大小就是4位元組dao,它不是求內容的長度,
5樓:匿名使用者
strlen獲取字串bai的長度。
每個中文du字元佔用zhi兩個位元組,所以dao中國是strlen是2+2=4;
英文字元儲存一版個位元組,故
權zg是1+1=2
sizeof用於求取佔用的空間。
但是注意,你求取的物件不是字串本身,而是變數本身。p和q兩個變數均為指標,指標在計算機中佔用4個位元組,所以最後兩個都是4.
6樓:匿名使用者
strlen的結果是bai
正確的,而dusizeof是在編譯的時候處理的,zhi這個dao時候編譯專器還不知道你這個指標指向的內容呢,因為你屬這個指標指向中國,是在執行的時候才處理的,好好想想,就是sizeof是在編譯的時候就已經算出結果了,不管你程式執行的時候指向**,它都是那個值。如果你寫sizeof(」中國」)那結果就是5了
以上純屬手打,望採納
c語言中sizeof和strlen的問題
7樓:匿名使用者
strlen是測試字串長度的函式,測試的值為字串中的實際長度(不包括'\0')。
sizeof的作用就是返回一個物件或者型別所佔的記憶體位元組數。一個字元佔一個位元組,a、b各佔一個,還有一個'\0',所以是3。
至於這個為什麼是五,因為賦給字元陣列的初值如果個數小於陣列的長度,其餘未賦值的元素自動定為空字元即'\0'
8樓:匿名使用者
2個意義不一樣的。
strlen 是函式。引數為 chan*, 專門針對字串的。
sizeof 是運算子,不是函式,可以這樣寫sizeof a, 等等。
strlen求字串的長度,不含字串結束標誌。因此strlen(a) == 3
sizeof求的是編譯器為陣列放分配的空間大小,一旦 char a[5] 定義了,則就會分配5個位元組的空間。
9樓:匿名使用者
樓主以後請別要用char a[5]="abc"這種用法。
因為基本沒人這麼用。當然這確實是給字元陣列賦初值的最快方法。
好的 你的認為4其實是不對的。
上面的char a="ab"不顯示宣告下標,那麼編譯器會根據需要取最小的需求滿足。
字串"ab"在記憶體中的表示是 a的ascii碼 b的ascii碼 \0
因為c/c++以\0為字串的結束符,所以\0是隱式的字元那麼這裡編譯器就把a自動宣告成3個下標的陣列了char a[ ]="ab";
和char a[3]="ab";
等效char a[2]="ab";就是錯誤的,因為放不下char a[4]="ab";就會最後一個下標的位置沒有資料,浪費了。
那一個陣列的下標是3,sizeof自然是3啦
10樓:閒談職乎哲也
sizeof(陣列名),得到的是這個陣列所佔的位元組數。
char a[ ]="ab"; 這樣的賦值方法,使得陣列的大小就是字串的大小;而」ab「是一個字串,字串是以'\0'結尾的,所以這個字串有3個字元,也就是說,陣列a有3個位元組的大小,所以是3了。
11樓:雨中抬頭
基礎太不紮實了!a[5]是陣列好不好?sizeof(a)當然= 5,strlen(a)= 3不用解釋了吧~char a[ ]="ab";
沒有定義陣列長度,系統會根據實際賦值的陣列大小來確定!當然就有sizeof(a)=2了
12樓:數學教輔資料
strlen(a)是求的該陣列的元素個數所以當a[ ]="ab"時,strlen(a)的結果是2;sizeof(a)是求陣列佔的空間的,當a[ ]="ab"時,它實際的空間就是3,因為最後還有自帶的一個結束符,也佔用一個空間。比如a="asdf",那麼sizeof(a)的結果就是5而不是4。
c語言中sizeof與strlen的區別是什麼
13樓:匿名使用者
一、指代不同
1、sizeof:用於獲取字串的長度,是處理字串的重要工具。
2、strlen:所作的是一個計數器的工作。
二、規則不同
1、sizeof:可用於任何變數名、型別名或常量值,當用於變數名(不是陣列名)或常量時,不需要用圓括號。
2、strlen:從記憶體的某個位置(可以是字串開頭,中間某個位置,甚至是某個不確定的記憶體區域)開始掃描,直到碰到第一個字串結束符'\0'為止,然後返回計數器值。
三、用法不同
1、sizeof:sizeof( type_name ); // sizeof( 型別 );編譯時起作用,而不是執行時。
2、strlen:extern unsigned int strlen(char *s);返回s的長度,不包括結束符null。
14樓:小丁創業
區別如下:
1、指代上的區別
(1)sizeof:用來獲取字串長度的導引,是處理字串的重要工具。
(2)strlen:做的是一個計數器。
2、用法上的區別
(1)sizeof:sizeof( type_name ); // sizeof(type); 在編譯時有效,而不是在執行時有效。
(2)strlen:extern unsigned int strlen(char *s); 返回s的長度,不包含終止符null。
3、規則上的區別
(1)sizeof:可用於任何變數名,型別名或常量值。 當用於變數名(不是陣列名)或常量時,不需要括號。
(2)strlen:從記憶體的某個特定位置開始掃描(可以是字串的開頭,中間的某個位置,甚至是不確定的儲存區域),直到第一個字串結束字元'\ 0'為止 ,然後返回計數器值。
15樓:小可
strlen(char*)函式求的是字串的實際長度,它求得方法是從開始到遇到第一個'\0',如果你只定義沒有給它賦初值,這個結果是不定的,它會從aa首地址一直找下去,直到遇到'\0'停止。
char aa[10];cout<>>> 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
sizeof返回物件所佔用的位元組大小. //正確
strlen返回字元個數. //正確
在使用sizeof時,有一個很特別的情況,就是陣列名到指標蛻變,
char array[3] = ;
sizeof(array) == 3;
char *p = array;
strlen(p) == 1;//sizeof(p)結果為4
在傳遞一個陣列名到一個函式中時,它會完全退化為一個指標
看完以上你是否很清楚sizeof和strlen的區別了呢?還不明白的話,我們看下面幾個例子:
第一個例子
char* ss = "0123456789";
sizeof(ss) 結果 4 ===》ss是指向字串常量的字元指標
sizeof(*ss) 結果 1 ===》*ss是第一個字元
大部分編譯程式 在編譯的時候就把sizeof計算過了 是型別或是變數的長度
這就是sizeof(x)可以用來定義陣列維數的原因
char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;
大部分編譯程式 在編譯的時候就把sizeof計算過了 是型別或是變數的長度
這就是sizeof(x)可以用來定義陣列維數的原因
char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;
char ss = "0123456789";
sizeof(ss) 結果 11 ===》ss是陣列,計算到\0位置,因此是10+1
sizeof(*ss) 結果 1 ===》*ss是第一個字元
char ss[100] = "0123456789";
sizeof(ss) 結果是100 ===》ss表示在記憶體中的大小 100×1
strlen(ss) 結果是10 ===》strlen是個函式內部實現是用一個迴圈計算到\0為止之前
int ss[100] = "0123456789";
sizeof(ss) 結果 400 ===》ss表示在記憶體中的大小 100×4
strlen(ss) 錯誤 ===》strlen的引數只能是char* 且必須是以'\0'結尾的
char q="abc";
char p="a\n";
sizeof(q),sizeof(p),strlen(q),strlen(p);
結果是 4 3 3 2
第三個例子
char szpath[max_path]
如果在函式內這樣定義,那麼sizeof(szpath)將會是max_path,但是將szpath作為虛參宣告時(void fun(char szpath[max_path])),sizeof(szpath)卻會是4(指標大小)
子char szpath[max_path]
如果在函式內這樣定義,那麼sizeof(szpath)將會是max_path,但是將szpath作為虛參宣告時(void fun(char szpath[max_path])),sizeof(szpath)卻會是4(指標大小)
還有一位網友的說明也很好:
其實理解 sizeof 只需要抓住一個要點:棧
程式儲存分佈有三個區域:棧、靜態和動態。能夠從**直接操作的物件,包括任何型別的變數、指標,都是在棧上的;動態和靜態儲存區是靠棧上的所有指標間接操作的。
sizeof 操作符,計算的是物件在棧上的投影體積;記住這個就很多東西都很清楚了。
char const * static_string = "hello";
sizeof(static_string) 是 sizeof 一個指標,所以在 32bit system 是 4
char stack_string = "hello";
sizeof(stack_string) 是 sizeof 一個陣列,所以是 6 * sizeof(char)
char * string = new char[6];
strncpy(string, "hello", 6");
sizeof(string) 是 sizeof 一個指標,所以還是 4。和第一個不同的是,這個指標指向了動態儲存區而不是靜態儲存區。
不管指標指向的內容在什麼地方,sizeof 得到的都是指標的棧大小
c++ 中對引用的處理比較特殊;sizeof 一個引用得到的結果是 sizeof 一個被引用的物件的大小;所以
struct o
;int main()
r 引用的是整個的 o 物件而不是指向 o 的指標,所以 sizeof r 的結果和 sizeof o 完全相同。
C語言程式設計題,求助大神,C語言程式程式設計題,求助大神
int fun int x int fun int x if x x count x return 0 樓上的都會不會看題?include int fun int x while xx i return 0 int main int argc,const char const argv return...
c語言程式設計題求幫忙,C語言程式設計題,求12!3!20!的和,怎麼做
是初學者嗎 這樣的問題最好說明哪一步不懂,自己練習還是最重要的scanf一位一位的讀入 乘除之後,switch case就ok了 include int main void char s 20 10x98765432 char id 20 int sum 0,i,yushu printf 請輸入身份...
C語言程式設計題,求助大佬解答,C語言程式設計題,求助大佬解答
題目是不是出錯了,應該是使用指標對有序陣列進行插入和排序吧,使用連結串列?這個怎麼理解?c語言程式設計題讀取時間求助,謝大佬了!字元轉整形抄的簡單應 bai用du 使用到頭文zhi件 math.h。例如dao void timeget const mytime time,int hour,int m...